aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/merger.rb
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2012-05-05 13:01:57 -0700
committerJon Leighton <j@jonathanleighton.com>2012-05-05 13:01:57 -0700
commitdcd04e76179611a9db28c9e391aa7d6c2a5b046a (patch)
tree381b5abe1547dd94bf216bbe4dd92746eb1c6a24 /activerecord/lib/active_record/relation/merger.rb
parent58a49875df63729f07a9a81d1ee349087d258df5 (diff)
parent0d8cf53296a4d7c1e6d85c533784a2607bfe3baa (diff)
downloadrails-dcd04e76179611a9db28c9e391aa7d6c2a5b046a.tar.gz
rails-dcd04e76179611a9db28c9e391aa7d6c2a5b046a.tar.bz2
rails-dcd04e76179611a9db28c9e391aa7d6c2a5b046a.zip
Merge pull request #5494 from armstrjare/active_record_relation_keep_association_join_context_on_merge
ActiveRecord::Relation - maintain context of joined associations on merges
Diffstat (limited to 'activerecord/lib/active_record/relation/merger.rb')
-rw-r--r--activerecord/lib/active_record/relation/merger.rb31
1 files changed, 28 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/merger.rb b/activerecord/lib/active_record/relation/merger.rb
index 3f880ce5e9..c2f0a82fd3 100644
--- a/activerecord/lib/active_record/relation/merger.rb
+++ b/activerecord/lib/active_record/relation/merger.rb
@@ -29,7 +29,7 @@ module ActiveRecord
end
class Merger
- attr_reader :relation, :values
+ attr_reader :relation, :other
def initialize(relation, other)
if other.default_scoped? && other.klass != relation.klass
@@ -37,13 +37,17 @@ module ActiveRecord
end
@relation = relation
- @values = other.values
+ @other = other
+ end
+
+ def values
+ @other.values
end
def normal_values
Relation::SINGLE_VALUE_METHODS +
Relation::MULTI_VALUE_METHODS -
- [:where, :order, :bind, :reverse_order, :lock, :create_with, :reordering]
+ [:where, :joins, :order, :bind, :reverse_order, :lock, :create_with, :reordering]
end
def merge
@@ -54,6 +58,7 @@ module ActiveRecord
merge_multi_values
merge_single_values
+ merge_joins
relation
end
@@ -84,6 +89,26 @@ module ActiveRecord
end
end
+ def merge_joins
+ return if values[:joins].blank?
+
+ if other.klass == relation.klass
+ relation.joins!(values[:joins])
+ else
+ joins_to_stash, other_joins = values[:joins].partition { |join|
+ case join
+ when Hash, Symbol, Array
+ true
+ else
+ false
+ end
+ }
+
+ join_dependency = ActiveRecord::Associations::JoinDependency.new(other.klass, joins_to_stash, [])
+ relation.joins!(join_dependency.join_associations + other_joins)
+ end
+ end
+
def merged_binds
if values[:bind]
(relation.bind_values + values[:bind]).uniq(&:first)