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
- #build_relation(*where_conditions) ⇒ Object
-
#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.
14 15 16 17 18 19 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 14 def initialize(model_class, rules) super @compressed_rules = RulesCompressor.new(@rules.reverse).rules_collapsed.reverse StiNormalizer.normalize(@compressed_rules) ConditionsNormalizer.normalize(model_class, @compressed_rules) end |
Class Method Details
.version_greater_or_equal?(version) ⇒ Boolean
6 7 8 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 6 def self.version_greater_or_equal?(version) Gem::Version.new(ActiveRecord.version).release >= Gem::Version.new(version) end |
.version_lower?(version) ⇒ Boolean
10 11 12 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 10 def self.version_lower?(version) Gem::Version.new(ActiveRecord.version).release < Gem::Version.new(version) end |
Instance Method Details
#build_relation(*where_conditions) ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 62 def build_relation(*where_conditions) relation = @model_class.where(*where_conditions) return relation unless joins.present? # subclasses must implement `build_joins_relation` build_joins_relation(relation, *where_conditions) end |
#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))"
36 37 38 39 40 41 42 43 44 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 36 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
52 53 54 55 56 57 58 59 60 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 52 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
46 47 48 49 50 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 46 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
72 73 74 75 76 77 78 |
# File 'lib/cancan/model_adapters/active_record_adapter.rb', line 72 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 |