diff options
author | Vipul A M <vipulnsward@gmail.com> | 2013-12-31 02:44:27 +0530 |
---|---|---|
committer | Vipul A M <vipulnsward@gmail.com> | 2013-12-31 02:47:37 +0530 |
commit | bb17c3b2105da30ef3260c3b489da85e4865eaa5 (patch) | |
tree | 8c3e4db574a16ca37cd31072f83ce3ec712101f5 /activerecord/test/cases | |
parent | 15e2eb42a7b1c251defd088ac65a89f152a307f6 (diff) | |
download | rails-bb17c3b2105da30ef3260c3b489da85e4865eaa5.tar.gz rails-bb17c3b2105da30ef3260c3b489da85e4865eaa5.tar.bz2 rails-bb17c3b2105da30ef3260c3b489da85e4865eaa5.zip |
https://github.com/rails/rails/commit/2075f39d726cef361170218fd16421fc52bed5a8 introduced a regression in includes/preloades
by calling `read_attribute` on an association when preloading takes places, instead of using loaded records in `association.target`.
tl;dr
Records are not made properly available via `read_attribute` when preloding in simultaneous,
but value of `@loaded` is already set true, and records concatenated in `association.target` on an association object.
When `@loaded` is true we return an object of `AlreadyLoaded` in preload_for. In `AlreadyLoaded` to return preloaded
records we make wrong use of `read_attribute`, instead of `target` records.
The regression is fixed by making use of the loaded records in `association.target` when the preloading takes place.
Fixes #13437
Diffstat (limited to 'activerecord/test/cases')
-rw-r--r-- | activerecord/test/cases/associations/cascaded_eager_loading_test.rb | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/activerecord/test/cases/associations/cascaded_eager_loading_test.rb b/activerecord/test/cases/associations/cascaded_eager_loading_test.rb index 811d91f849..904d85266e 100644 --- a/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +++ b/activerecord/test/cases/associations/cascaded_eager_loading_test.rb @@ -174,4 +174,18 @@ class CascadedEagerLoadingTest < ActiveRecord::TestCase sink = Vertex.all.merge!(:includes=>{:sources=>{:sources=>{:sources=>:sources}}}, :order => 'vertices.id DESC').first assert_equal vertices(:vertex_1), assert_no_queries { sink.sources.first.sources.first.sources.first.sources.first } end + + def test_eager_association_loading_with_cascaded_interdependent_one_level_and_two_levels + authors_relation = Author.all.merge!(:includes => [:comments, {:posts => :categorizations}], :order => "authors.id") + assert_nothing_raised do + authors_relation.to_a + end + authors = authors_relation.to_a + assert_equal 3, authors.size + assert_equal 10, authors[0].comments.size + assert_equal 1, authors[1].comments.size + assert_equal 5, authors[0].posts.size + assert_equal 3, authors[1].posts.size + assert_equal 3, authors[0].posts.collect { |post| post.categorizations.size }.inject(0) { |sum, i| sum+i } + end end |