diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2017-11-11 03:54:10 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2017-11-11 04:02:09 +0900 |
commit | 4528dd6327f35d3139a48cbac9c9192f2253cbad (patch) | |
tree | c904f447f7c72141b62bfff4ad2c58fe2b3a5f51 /activerecord | |
parent | fc7a6c738122ba9dd6eff4ede08d67e86a3f0ea7 (diff) | |
download | rails-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')
-rw-r--r-- | activerecord/lib/active_record/relation/merger.rb | 18 | ||||
-rw-r--r-- | activerecord/test/cases/relation_test.rb | 9 |
2 files changed, 17 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 diff --git a/activerecord/test/cases/relation_test.rb b/activerecord/test/cases/relation_test.rb index fd5985ffe7..8362722e12 100644 --- a/activerecord/test/cases/relation_test.rb +++ b/activerecord/test/cases/relation_test.rb @@ -274,6 +274,15 @@ module ActiveRecord assert_equal({ 2 => 1, 4 => 3, 5 => 1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count) end + def test_relation_merging_keeps_joining_order + authors = Author.where(id: 1) + posts = Post.joins(:author).merge(authors) + comments = Comment.joins(:post).merge(posts) + ratings = Rating.joins(:comment).merge(comments) + + assert_equal 3, ratings.count + end + class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value def type :string |