Skip to content

Commit 136066f

Browse files
authored
Merge pull request rails#46579 from joshuay03/fix-through-association-incorrect-preloading
Fix: Incorrectly preloading through association records when middle association has been loaded
2 parents 99065d2 + 0178e1d commit 136066f

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

activerecord/lib/active_record/associations/preloader/through_association.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def source_preloaders
7474
end
7575

7676
def middle_records
77-
through_preloaders.flat_map(&:preloaded_records)
77+
through_records_by_owner.values.flatten
7878
end
7979

8080
def through_preloaders

activerecord/test/cases/associations_test.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
require "models/sharded/blog"
3838
require "models/sharded/blog_post"
3939
require "models/sharded/comment"
40+
require "models/member_detail"
41+
require "models/organization"
4042

4143

4244
class AssociationsTest < ActiveRecord::TestCase
@@ -539,8 +541,8 @@ def test_associations_raise_with_name_error_if_associated_to_classes_that_do_not
539541
end
540542

541543
class PreloaderTest < ActiveRecord::TestCase
542-
fixtures :posts, :comments, :books, :authors, :tags, :taggings, :essays, :categories,
543-
:author_addresses, :sharded_blog_posts, :sharded_comments
544+
fixtures :posts, :comments, :books, :authors, :tags, :taggings, :essays, :categories, :author_addresses,
545+
:sharded_blog_posts, :sharded_comments, :members, :member_details, :organizations
544546

545547
def test_preload_with_scope
546548
post = posts(:welcome)
@@ -629,6 +631,21 @@ def test_preload_grouped_queries_of_through_records
629631
end
630632
end
631633

634+
def test_preload_through_records_with_already_loaded_middle_record
635+
member = members(:groucho)
636+
expected_member_detail_ids = member.organization_member_details_2.pluck(:id)
637+
638+
member.reload.organization # load through record
639+
640+
assert_queries(1) do
641+
ActiveRecord::Associations::Preloader.new(records: [member], associations: :organization_member_details_2).call
642+
end
643+
644+
assert_no_queries do
645+
assert_equal expected_member_detail_ids.sort, member.organization_member_details_2.map(&:id).sort
646+
end
647+
end
648+
632649
def test_preload_with_instance_dependent_scope
633650
david = authors(:david)
634651
david2 = Author.create!(name: "David")

0 commit comments

Comments
 (0)