aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/relation')
-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)