mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Relation merging should keep joining order
`joins_values.partition` will break joins values order. It should be kept as user intended order. Fixes #15488.
This commit is contained in:
parent
fc7a6c7381
commit
4528dd6327
2 changed files with 17 additions and 10 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue