aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2017-11-11 03:54:10 +0900
committerRyuta Kamizono <kamipo@gmail.com>2017-11-11 04:02:09 +0900
commit4528dd6327f35d3139a48cbac9c9192f2253cbad (patch)
treec904f447f7c72141b62bfff4ad2c58fe2b3a5f51 /activerecord/lib/active_record/relation
parentfc7a6c738122ba9dd6eff4ede08d67e86a3f0ea7 (diff)
downloadrails-4528dd6327f35d3139a48cbac9c9192f2253cbad.tar.gz
rails-4528dd6327f35d3139a48cbac9c9192f2253cbad.tar.bz2
rails-4528dd6327f35d3139a48cbac9c9192f2253cbad.zip
Relation merging should keep joining order
`joins_values.partition` will break joins values order. It should be kept as user intended order. Fixes #15488.
Diffstat (limited to 'activerecord/lib/active_record/relation')
-rw-r--r--activerecord/lib/active_record/relation/merger.rb18
1 files changed, 8 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/relation/merger.rb b/activerecord/lib/active_record/relation/merger.rb
index ebc72d28fd..b736b21525 100644
--- a/activerecord/lib/active_record/relation/merger.rb
+++ b/activerecord/lib/active_record/relation/merger.rb
@@ -112,22 +112,20 @@ module ActiveRecord
if other.klass == relation.klass
relation.joins!(*other.joins_values)
else
- joins_dependency, rest = other.joins_values.partition do |join|
+ alias_tracker = nil
+ joins_dependency = other.joins_values.map do |join|
case join
when Hash, Symbol, Array
- true
+ alias_tracker ||= other.alias_tracker
+ ActiveRecord::Associations::JoinDependency.new(
+ other.klass, other.table, join, alias_tracker
+ )
else
- false
+ join
end
end
- join_dependency = ActiveRecord::Associations::JoinDependency.new(
- other.klass, other.table, joins_dependency, other.alias_tracker
- )
-
- relation.joins! rest
-
- @relation = relation.joins join_dependency
+ relation.joins!(*joins_dependency)
end
end