Class: ActiveRecord::Associations::JoinDependency::JoinAssociation
- Inherits:
-
JoinPart
- Object
- JoinPart
- ActiveRecord::Associations::JoinDependency::JoinAssociation
- Defined in:
- lib/active_record/associations/join_dependency/join_association.rb
Overview
:nodoc:
Instance Attribute Summary collapse
-
#reflection ⇒ Object
readonly
Returns the value of attribute reflection.
-
#table ⇒ Object
Returns the value of attribute table.
-
#tables ⇒ Object
Returns the value of attribute tables.
Attributes inherited from JoinPart
Instance Method Summary collapse
-
#initialize(reflection, children) ⇒ JoinAssociation
constructor
A new instance of JoinAssociation.
- #join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) ⇒ Object
- #match?(other) ⇒ Boolean
- #readonly? ⇒ Boolean
Methods inherited from JoinPart
#each, #each_children, #extract_record, #instantiate
Constructor Details
#initialize(reflection, children) ⇒ JoinAssociation
Returns a new instance of JoinAssociation.
13 14 15 16 17 18 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 13 def initialize(reflection, children) super(reflection.klass, children) @reflection = reflection @tables = nil end |
Instance Attribute Details
#reflection ⇒ Object (readonly)
Returns the value of attribute reflection.
10 11 12 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 10 def reflection @reflection end |
#table ⇒ Object
Returns the value of attribute table.
11 12 13 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 11 def table @table end |
#tables ⇒ Object
Returns the value of attribute tables.
10 11 12 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 10 def tables @tables end |
Instance Method Details
#join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) ⇒ Object
[View source]
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 25 def join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) joins = [] # The chain starts with the target table, but we want to end with it here (makes # more sense in this context), so we reverse reflection.chain.reverse_each.with_index(1) do |reflection, i| table = tables[-i] klass = reflection.klass join_scope = reflection.join_scope(table, foreign_table, foreign_klass) unless join_scope.references_values.empty? join_dependency = join_scope.construct_join_dependency( join_scope.eager_load_values | join_scope.includes_values, Arel::Nodes::OuterJoin ) join_scope.joins!(join_dependency) end arel = join_scope.arel(alias_tracker.aliases) nodes = arel.constraints.first others = nodes.children.extract! do |node| !Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name } end joins << table.create_join(table, table.create_on(nodes), join_type) unless others.empty? joins.concat arel.join_sources append_constraints(joins.last, others) end # The current table in this iteration becomes the foreign table in the next foreign_table, foreign_klass = table, klass end joins end |
#match?(other) ⇒ Boolean
20 21 22 23 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 20 def match?(other) return true if self == other super && reflection == other.reflection end |
#readonly? ⇒ Boolean
69 70 71 72 73 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 69 def readonly? return @readonly if defined?(@readonly) @readonly = reflection.scope && reflection.scope_for(base_klass.unscoped).readonly_value end |