aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/spawn_methods.rb
diff options
context:
space:
mode:
authorAndrew Horner <andrew@tablexi.com>2013-04-18 23:41:58 -0500
committerAndrew Horner <andrew@tablexi.com>2013-05-11 22:41:47 -0500
commitc09829e03db611b46bb52e2054991222cf57bfbe (patch)
tree42c34f507693ff5e154272f830509a00b89a4462 /activerecord/lib/active_record/relation/spawn_methods.rb
parent5c6cf4e59e3e9c75395541162f2741b82347af0a (diff)
downloadrails-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.rb28
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