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
readonly
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
- #strict_loading? ⇒ 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 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 13 def initialize(reflection, children) super(reflection.klass, children) @reflection = reflection 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 (readonly)
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]
24 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 24 def join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) joins = [] chain = [] reflection.chain.each do |reflection| table, terminated = yield reflection @table ||= table if terminated foreign_table, foreign_klass = table, reflection.klass break end chain << [reflection, table] end # The chain starts with the target table, but we want to end with it here (makes # more sense in this context), so we reverse chain.reverse_each do |reflection, table| klass = reflection.klass scope = reflection.join_scope(table, foreign_table, foreign_klass) unless scope.references_values.empty? associations = scope.eager_load_values | scope.includes_values unless associations.empty? scope.joins! scope.construct_join_dependency(associations, Arel::Nodes::OuterJoin) end end arel = scope.arel(alias_tracker.aliases) nodes = arel.constraints.first if nodes.is_a?(Arel::Nodes::And) others = nodes.children.extract! do |node| !Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name } end end joins << join_type.new(table, Arel::Nodes::On.new(nodes)) if others && !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
19 20 21 22 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 19 def match?(other) return true if self == other super && reflection == other.reflection end |
#readonly? ⇒ Boolean
78 79 80 81 82 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 78 def readonly? return @readonly if defined?(@readonly) @readonly = reflection.scope && reflection.scope_for(base_klass.unscoped).readonly_value end |
#strict_loading? ⇒ Boolean
84 85 86 87 88 |
# File 'lib/active_record/associations/join_dependency/join_association.rb', line 84 def strict_loading? return @strict_loading if defined?(@strict_loading) @strict_loading = reflection.scope && reflection.scope_for(base_klass.unscoped).strict_loading_value end |