Skip to content

Commit 94fe243

Browse files
committed
Merge pull request rails#37457 from sinsoku/fix_issue_37446
Fix an issue with duplicate preloaded records
1 parent 036fe8e commit 94fe243

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

activerecord/lib/active_record/associations/preloader.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def preloaders_for_hash(association, records, scope, polymorphic_parent)
112112
association.flat_map { |parent, child|
113113
grouped_records(parent, records, polymorphic_parent).flat_map do |reflection, reflection_records|
114114
loaders = preloaders_for_reflection(reflection, reflection_records, scope)
115-
recs = loaders.flat_map(&:preloaded_records)
115+
recs = loaders.flat_map(&:preloaded_records).uniq
116116
child_polymorphic_parent = reflection && reflection.options[:polymorphic]
117117
loaders.concat Array.wrap(child).flat_map { |assoc|
118118
preloaders_on assoc, recs, scope, child_polymorphic_parent

activerecord/test/cases/associations/cascaded_eager_loading_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,14 @@ def test_eager_association_loading_with_cascaded_interdependent_one_level_and_tw
190190
assert_equal 3, authors[1].posts.size
191191
assert_equal 3, authors[0].posts.collect { |post| post.categorizations.size }.inject(0) { |sum, i| sum + i }
192192
end
193+
194+
def test_preloaded_records_are_not_duplicated
195+
author = Author.first
196+
expected = Post.where(author: author)
197+
.includes(author: :first_posts).map { |post| post.author.first_posts.size }
198+
actual = author.posts
199+
.includes(author: :first_posts).map { |post| post.author.first_posts.size }
200+
201+
assert_equal expected, actual
202+
end
193203
end

0 commit comments

Comments
 (0)