Class: CanCan::ModelAdapters::ActiveRecordAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- CanCan::ModelAdapters::ActiveRecordAdapter
- Defined in:
- lib/cancan/model_adapters/active_record_adapter.rb
Direct Known Subclasses
Class Method Summary collapse
Instance Method Summary collapse
-
#conditions ⇒ Object
Returns conditions intended to be used inside a database query.
- #database_records ⇒ Object
- #extract_multiple_conditions(conditions_extractor, rules) ⇒ Object
-
#initialize(model_class, rules) ⇒ ActiveRecordAdapter
constructor
A new instance of ActiveRecordAdapter.
-
#joins ⇒ Object
Returns the associations used in conditions for the :joins option of a search.
Methods inherited from AbstractAdapter
adapter_class, find, for_class?, inherited, matches_condition?, matches_conditions_hash?, override_condition_matching?, override_conditions_hash_matching?
Constructor Details
#initialize(model_class, rules) ⇒ ActiveRecordAdapter
Returns a new instance of ActiveRecordAdapter.
16 17 18 19 20 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 16 def initialize(model_class, rules) super @compressed_rules = RulesCompressor.new(@rules.reverse).rules_collapsed.reverse ConditionsNormalizer.normalize(model_class, @compressed_rules) end |
Class Method Details
.version_greater_or_equal?(version) ⇒ Boolean
8 9 10 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 8 def self.version_greater_or_equal?(version) Gem::Version.new(ActiveRecord.version).release >= Gem::Version.new(version) end |
.version_lower?(version) ⇒ Boolean
12 13 14 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 12 def self.version_lower?(version) Gem::Version.new(ActiveRecord.version).release < Gem::Version.new(version) end |
Instance Method Details
#conditions ⇒ Object
Returns conditions intended to be used inside a database query. Normally you will not call this method directly, but instead go through ModelAdditions#accessible_by.
If there is only one “can” definition, a hash of conditions will be returned matching the one defined.
can :manage, User, :id => 1
query(:manage, User).conditions # => { :id => 1 }
If there are multiple “can” definitions, a SQL string will be returned to handle complex cases.
can :manage, User, :id => 1
can :manage, User, :manager_id => 1
cannot :manage, User, :self_managed => true
query(:manage, User).conditions # => "not (self_managed = 't') AND ((manager_id = 1) OR (id = 1))"
37 38 39 40 41 42 43 44 45 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 37 def conditions conditions_extractor = ConditionsExtractor.new(@model_class) if @compressed_rules.size == 1 && @compressed_rules.first.base_behavior # Return the conditions directly if there's just one definition conditions_extractor.tableize_conditions(@compressed_rules.first.conditions).dup else extract_multiple_conditions(conditions_extractor, @compressed_rules) end end |
#database_records ⇒ Object
53 54 55 56 57 58 59 60 61 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 53 def database_records if override_scope @model_class.where(nil).merge(override_scope) elsif @model_class.respond_to?(:where) && @model_class.respond_to?(:joins) build_relation(conditions) else @model_class.all(conditions: conditions, joins: joins) end end |
#extract_multiple_conditions(conditions_extractor, rules) ⇒ Object
47 48 49 50 51 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 47 def extract_multiple_conditions(conditions_extractor, rules) rules.reverse.inject(false_sql) do |sql, rule| merge_conditions(sql, conditions_extractor.tableize_conditions(rule.conditions).dup, rule.base_behavior) end end |
#joins ⇒ Object
Returns the associations used in conditions for the :joins option of a search. See ModelAdditions#accessible_by
65 66 67 68 69 70 71 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 65 def joins joins_hash = {} @compressed_rules.reverse_each do |rule| deep_merge(joins_hash, rule.associations_hash) end deep_clean(joins_hash) unless joins_hash.empty? end |