aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/join_dependency/join_association.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/associations/join_dependency/join_association.rb')
-rw-r--r--activerecord/lib/active_record/associations/join_dependency/join_association.rb26
1 files changed, 16 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/associations/join_dependency/join_association.rb b/activerecord/lib/active_record/associations/join_dependency/join_association.rb
index 4121a5b378..c32753782f 100644
--- a/activerecord/lib/active_record/associations/join_dependency/join_association.rb
+++ b/activerecord/lib/active_record/associations/join_dependency/join_association.rb
@@ -89,21 +89,14 @@ module ActiveRecord
foreign_key = reflection.active_record_primary_key
end
- constraint = table[key].eq(foreign_table[foreign_key])
+ constraint = build_constraint(reflection, table, key, foreign_table, foreign_key)
- if reflection.klass.finder_needs_type_condition?
- constraint = table.create_and([
- constraint,
- reflection.klass.send(:type_condition, table)
- ])
+ unless conditions[i].empty?
+ constraint = constraint.and(sanitize(conditions[i], table))
end
relation.from(join(table, constraint))
- unless conditions[i].empty?
- relation.where(sanitize(conditions[i], table))
- end
-
# The current table in this iteration becomes the foreign table in the next
foreign_table = table
end
@@ -111,6 +104,19 @@ module ActiveRecord
relation
end
+ def build_constraint(reflection, table, key, foreign_table, foreign_key)
+ constraint = table[key].eq(foreign_table[foreign_key])
+
+ if reflection.klass.finder_needs_type_condition?
+ constraint = table.create_and([
+ constraint,
+ reflection.klass.send(:type_condition, table)
+ ])
+ end
+
+ constraint
+ end
+
def join_relation(joining_relation)
self.join_type = Arel::OuterJoin
joining_relation.joins(self)