Sha256: b9dd3ad346d3853ff26906f1d549be7bbd350e6a7dd867aabb6ff918fb27092a

Contents?: true

Size: 1.8 KB

Versions: 12

Compression:

Stored size: 1.8 KB

Contents

module CanCan
  module ModelAdapters
    class MongoidAdapter < AbstractAdapter
      def self.for_class?(model_class)
        model_class <= Mongoid::Document
      end

      def self.override_conditions_hash_matching?(subject, conditions)
        conditions.any? do |k,v|
          key_is_not_symbol = lambda { !k.kind_of?(Symbol) }
          subject_value_is_array = lambda do
            subject.respond_to?(k) && subject.send(k).is_a?(Array)
          end

          key_is_not_symbol.call || subject_value_is_array.call
        end
      end

      def self.matches_conditions_hash?(subject, conditions)
        # To avoid hitting the db, retrieve the raw Mongo selector from
        # the Mongoid Criteria and use Mongoid::Matchers#matches?
        subject.matches?( subject.class.where(conditions).selector )
      end

      def database_records
        if @rules.size == 0
          @model_class.where(:_id => {'$exists' => false, '$type' => 7}) # return no records in Mongoid
        elsif @rules.size == 1 && @rules[0].conditions.is_a?(Mongoid::Criteria)
          @rules[0].conditions
        else
          # we only need to process can rules if
          # there are no rules with empty conditions
          rules = @rules.reject { |rule| rule.conditions.empty? }
          process_can_rules = @rules.count == rules.count
          rules.inject(@model_class.all) do |records, rule|
            if process_can_rules && rule.base_behavior
              records.or rule.conditions
            elsif !rule.base_behavior
              records.excludes rule.conditions
            else
              records
            end
          end
        end
      end
    end
  end
end

# simplest way to add `accessible_by` to all Mongoid Documents
module Mongoid::Document::ClassMethods
  include CanCan::ModelAdditions::ClassMethods
end

Version data entries

12 entries across 12 versions & 6 rubygems

Version Path
sunrise-cms-0.3.3 vendor/bundle/ruby/1.9.1/gems/cancan-1.6.7/lib/cancan/model_adapters/mongoid_adapter.rb
sunrise-cms-0.3.2 vendor/bundle/ruby/1.9.1/gems/cancan-1.6.7/lib/cancan/model_adapters/mongoid_adapter.rb
sunrise-cms-0.3.1 vendor/bundle/ruby/1.9.1/gems/cancan-1.6.7/lib/cancan/model_adapters/mongoid_adapter.rb
sunrise-cms-0.3.0 vendor/bundle/ruby/1.9.1/gems/cancan-1.6.7/lib/cancan/model_adapters/mongoid_adapter.rb
sunrise-cms-0.3.0.rc vendor/bundle/ruby/1.9.1/gems/cancan-1.6.7/lib/cancan/model_adapters/mongoid_adapter.rb
cancan-1.6.7 lib/cancan/model_adapters/mongoid_adapter.rb
codeprimate-cancan-1.6.5 lib/cancan/model_adapters/mongoid_adapter.rb
corntrace-cancan-1.6.5 lib/cancan/model_adapters/mongoid_adapter.rb
cancant-0.0.1.beta2 lib/cancan/model_adapters/mongoid_adapter.rb
cancant-0.0.1.beta1 lib/cancan/model_adapters/mongoid_adapter.rb
cancat-0.0.1.beta1 lib/cancan/model_adapters/mongoid_adapter.rb
cancan-1.6.5 lib/cancan/model_adapters/mongoid_adapter.rb