diff options
author | Andrew Horner <andrew@tablexi.com> | 2013-04-18 23:41:58 -0500 |
---|---|---|
committer | Andrew Horner <andrew@tablexi.com> | 2013-05-11 22:41:47 -0500 |
commit | c09829e03db611b46bb52e2054991222cf57bfbe (patch) | |
tree | 42c34f507693ff5e154272f830509a00b89a4462 /activerecord/lib/active_record/relation/spawn_methods.rb | |
parent | 5c6cf4e59e3e9c75395541162f2741b82347af0a (diff) | |
download | rails-c09829e03db611b46bb52e2054991222cf57bfbe.tar.gz rails-c09829e03db611b46bb52e2054991222cf57bfbe.tar.bz2 rails-c09829e03db611b46bb52e2054991222cf57bfbe.zip |
Preserve context for joins while merging relations
This is a backport of #10164, already merged into
master. The issue is described in lengthy detail
in issues #3002 and #5494.
Diffstat (limited to 'activerecord/lib/active_record/relation/spawn_methods.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/spawn_methods.rb | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/relation/spawn_methods.rb b/activerecord/lib/active_record/relation/spawn_methods.rb index b8e384c2f3..90f2ac3cde 100644 --- a/activerecord/lib/active_record/relation/spawn_methods.rb +++ b/activerecord/lib/active_record/relation/spawn_methods.rb @@ -27,7 +27,7 @@ module ActiveRecord merge_relation_method(merged_relation, method, value) if value.present? end - merged_relation.joins_values += r.joins_values + merge_joins(merged_relation, r) merged_wheres = @where_values + r.where_values @@ -146,6 +146,32 @@ module ActiveRecord private + def merge_joins(relation, other) + values = other.joins_values + return if values.blank? + + if other.klass == relation.klass + relation.joins_values += values + else + joins_dependency, rest = values.partition do |join| + case join + when Hash, Symbol, Array + true + else + false + end + end + + join_dependency = ActiveRecord::Associations::JoinDependency.new( + other.klass, + joins_dependency, + [] + ) + + relation.joins_values += join_dependency.join_associations + rest + end + end + def merge_relation_method(relation, method, value) relation.send(:"#{method}_values=", relation.send(:"#{method}_values") + value) end |