Skip to content

Commit d6a3c90

Browse files
authored
Merge pull request #160 from kbrock/preload_array_assoc
Better detection of standard preload
2 parents 961b93a + 36bbc38 commit d6a3c90

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

lib/active_record/virtual_attributes/virtual_fields.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,12 @@ def call
152152

153153
# convert the includes with virtual attributes to includes with proper associations
154154
records_by_assoc = records.group_by { |rec| assoc_cache[rec.class] }
155-
# if these are the same includes, then do the preloader work
156-
return super if records_by_assoc.size == 1 && records_by_assoc.keys.first == associations
155+
# If the association were already translated, then short circuit / do the standard preloader work.
156+
# When replace_virtual_fields removes the outer array, match that too.
157+
if records_by_assoc.size == 1 &&
158+
(associations == records_by_assoc.keys.first || associations == [records_by_assoc.keys.first])
159+
return super
160+
end
157161

158162
# for each of the associations, run a preloader
159163
records_by_assoc.each do |klass_associations, klass_records|

spec/virtual_includes_spec.rb

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,6 @@
182182
expect(Author.includes(:books => :author_name).references(:books)).to preload_values(:first_book_author_name, author_name)
183183
expect(Author.includes(:books => [:author_name]).references(:books)).to preload_values(:first_book_author_name, author_name)
184184
expect(Author.includes(:books => {:author_name => {}}).references(:books)).to preload_values(:first_book_author_name, author_name)
185-
end
186-
187-
it "uses preloaded fields" do
188-
expect(Author.includes(:books => :author_name).references(:books)).to preload_values(:first_book_author_name, author_name)
189-
expect(Author.includes(:books => [:author_name]).references(:books)).to preload_values(:first_book_author_name, author_name)
190-
expect(Author.includes(:books => {:author_name => {}}).references(:books)).to preload_values(:first_book_author_name, author_name)
191185
inc = Author.virtual_includes(:first_book_author_name)
192186
expect(Author.includes(inc).references(:books)).to preload_values(:first_book_author_name, author_name)
193187
end
@@ -310,10 +304,6 @@
310304
it "uses included fields" do
311305
expect(preloaded(Author.all.to_a, :books => :author_name)).to preload_values(:first_book_author_name, author_name)
312306
end
313-
314-
it "uses preloaded fields" do
315-
expect(preloaded(Author.all.to_a, :books => :author_name)).to preload_values(:first_book_author_name, author_name)
316-
end
317307
end
318308

319309
context "preloads virtual_reflection with includes" do
@@ -388,11 +378,50 @@
388378
end
389379
end
390380

381+
describe ".eager_load" do
382+
it "preloads standard associations (:books)" do
383+
expect(Author.eager_load(:books)).to preload_values(:first_book_name, book_name)
384+
expect(Author.eager_load([:books])).to preload_values(:first_book_name, book_name)
385+
expect(Author.eager_load([[:books]])).to preload_values(:first_book_name, book_name)
386+
expect(Author.eager_load(:books => {})).to preload_values(:first_book_name, book_name)
387+
end
388+
389+
it "preloads associations (:uses => :books)" do
390+
expect(Author.eager_load(:first_book_name)).to preload_values(:first_book_name, book_name)
391+
expect(Author.eager_load([:first_book_name])).to preload_values(:first_book_name, book_name)
392+
expect(Author.eager_load([[:first_book_name]])).to preload_values(:first_book_name, book_name)
393+
expect(Author.eager_load(:first_book_name => {})).to preload_values(:first_book_name, book_name)
394+
end
395+
end
396+
397+
describe ".preload" do
398+
it "preloads standard associations (:books)" do
399+
expect(Author.preload(:books)).to preload_values(:first_book_name, book_name)
400+
expect(Author.preload([:books])).to preload_values(:first_book_name, book_name)
401+
expect(Author.preload([[:books]])).to preload_values(:first_book_name, book_name)
402+
expect(Author.preload(:books => {})).to preload_values(:first_book_name, book_name)
403+
end
404+
405+
it "preloads associations (:uses => :books)" do
406+
expect(Author.preload(:first_book_name)).to preload_values(:first_book_name, book_name)
407+
expect(Author.preload([:first_book_name])).to preload_values(:first_book_name, book_name)
408+
expect(Author.preload([[:first_book_name]])).to preload_values(:first_book_name, book_name)
409+
expect(Author.preload(:first_book_name => {})).to preload_values(:first_book_name, book_name)
410+
end
411+
end
412+
391413
context "preloads virtual_reflection with preloader" do
392414
it "preloads virtual_reflection (:uses => :books)" do
393415
expect(preloaded(Author.all.to_a, :named_books)).to preload_values(:named_books, named_books)
394416
end
395417

418+
it "preloads virtual_reflection ([:books])" do
419+
expect(preloaded(Author.all.to_a, :books)).to preload_values(:named_books, named_books)
420+
# NOTE: the next test shows a double preloader call
421+
expect(preloaded(Author.all.to_a, [:books])).to preload_values(:named_books, named_books)
422+
expect(preloaded(Author.all.to_a, :books => {})).to preload_values(:named_books, named_books)
423+
end
424+
396425
it "preloads virtual_reflection (:uses => {:books => :author_name})" do
397426
expect(preloaded(Author.all.to_a, :books_with_authors)).to preload_values(:books_with_authors, named_books)
398427
end

0 commit comments

Comments
 (0)