Class: CanCan::ModelAdapters::SequelAdapter

Inherits:
AbstractAdapter show all
Defined in:
lib/cancan/model_adapters/sequel_adapter.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from AbstractAdapter

adapter_class, inherited, #initialize, matches_conditions_hash?, override_conditions_hash_matching?

Constructor Details

This class inherits a constructor from CanCan::ModelAdapters::AbstractAdapter

Class Method Details

.find(model_class, id) ⇒ Object



8
9
10
# File 'lib/cancan/model_adapters/sequel_adapter.rb', line 8

def self.find(model_class, id)
  model_class[id]
end

.for_class?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


4
5
6
# File 'lib/cancan/model_adapters/sequel_adapter.rb', line 4

def self.for_class?(model_class)
  model_class <= Sequel::Model
end

.matches_condition?(subject, name, value) ⇒ Boolean

Returns:

  • (Boolean)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/cancan/model_adapters/sequel_adapter.rb', line 16

def self.matches_condition?(subject, name, value)
  obj = subject.send(name)
  if obj.nil?
    false
  else
    value.each do |k, v|
      if v.kind_of?(Hash)
        return false unless self.matches_condition?(obj, k, v)
      elsif obj.send(k) != v
        return false
      end
    end
  end
end

.override_condition_matching?(subject, name, value) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/cancan/model_adapters/sequel_adapter.rb', line 12

def self.override_condition_matching?(subject, name, value)
  value.kind_of?(Hash)
end

Instance Method Details

#database_recordsObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/cancan/model_adapters/sequel_adapter.rb', line 31

def database_records
  if @rules.size == 0
    @model_class.where('1=0')
  else
    # only need to process can rules if there are no can rule with empty conditions
    rules = @rules.reject { |rule| rule.base_behavior && rule.conditions.empty? }
    rules.reject! { |rule| rule.base_behavior } if rules.count < @rules.count

    can_condition_added = false
    rules.reverse.inject(@model_class.dataset) do |records, rule|
      normalized_conditions = normalize_conditions(rule.conditions)
      if rule.base_behavior
        if can_condition_added
          records.or normalized_conditions
        else
          can_condition_added = true
          records.where normalized_conditions
        end
      else
        records.exclude normalized_conditions
      end
    end
  end
end