aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-05-20 10:16:57 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2014-05-20 10:16:57 -0700
commitb713e207d470fe01ce8ea945163c6c2540292301 (patch)
tree6798a1a36c8d538c8e42dafc713ad2e7049e12ac
parent9d835fd7f23138b90490f47df9920c62dceb7356 (diff)
downloadrails-b713e207d470fe01ce8ea945163c6c2540292301.tar.gz
rails-b713e207d470fe01ce8ea945163c6c2540292301.tar.bz2
rails-b713e207d470fe01ce8ea945163c6c2540292301.zip
fix multiple hash preloads. Fixes #14994
-rw-r--r--activerecord/lib/active_record/associations/preloader.rb13
-rw-r--r--activerecord/test/cases/relations_test.rb7
2 files changed, 14 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/associations/preloader.rb b/activerecord/lib/active_record/associations/preloader.rb
index 20bd4947dc..42571d6af0 100644
--- a/activerecord/lib/active_record/associations/preloader.rb
+++ b/activerecord/lib/active_record/associations/preloader.rb
@@ -112,13 +112,14 @@ module ActiveRecord
end
def preloaders_for_hash(association, records, scope)
- parent, child = association.to_a.first # hash should only be of length 1
+ association.flat_map { |parent, child|
+ loaders = preloaders_for_one parent, records, scope
- loaders = preloaders_for_one parent, records, scope
-
- recs = loaders.flat_map(&:preloaded_records).uniq
- loaders.concat Array.wrap(child).flat_map { |assoc|
- preloaders_on assoc, recs, scope
+ recs = loaders.flat_map(&:preloaded_records).uniq
+ loaders.concat Array.wrap(child).flat_map { |assoc|
+ preloaders_on assoc, recs, scope
+ }
+ loaders
}
end
diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb
index 6ab1bd8c8b..fbba554e39 100644
--- a/activerecord/test/cases/relations_test.rb
+++ b/activerecord/test/cases/relations_test.rb
@@ -508,6 +508,13 @@ class RelationTest < ActiveRecord::TestCase
end
end
+ def test_deep_preload
+ post = Post.preload(author: :posts, comments: :post).first
+
+ assert_predicate post.author.association(:posts), :loaded?
+ assert_predicate post.comments.first.association(:post), :loaded?
+ end
+
def test_preload_applies_to_all_chained_preloaded_scopes
assert_queries(3) do
post = Post.with_comments.with_tags.first