mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
Ensure ActiveRecord::Base.find_in_batches fires doesnt fire an extra query unless needed
This commit is contained in:
@@ -49,12 +49,15 @@ module ActiveRecord
|
||||
raise "You can't specify a limit, it's forced to be the batch_size" if options[:limit]
|
||||
|
||||
start = options.delete(:start).to_i
|
||||
batch_size = options.delete(:batch_size) || 1000
|
||||
|
||||
with_scope(:find => options.merge(:order => batch_order, :limit => options.delete(:batch_size) || 1000)) do
|
||||
with_scope(:find => options.merge(:order => batch_order, :limit => batch_size)) do
|
||||
records = find(:all, :conditions => [ "#{table_name}.#{primary_key} >= ?", start ])
|
||||
|
||||
while records.any?
|
||||
yield records
|
||||
|
||||
break if records.size < batch_size
|
||||
records = find(:all, :conditions => [ "#{table_name}.#{primary_key} > ?", records.last.id ])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -46,4 +46,16 @@ class EachTest < ActiveRecord::TestCase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_find_in_batches_shouldnt_excute_query_unless_needed
|
||||
post_count = Post.count
|
||||
|
||||
assert_queries(2) do
|
||||
Post.find_in_batches(:batch_size => post_count) {|batch| assert_kind_of Array, batch }
|
||||
end
|
||||
|
||||
assert_queries(1) do
|
||||
Post.find_in_batches(:batch_size => post_count + 1) {|batch| assert_kind_of Array, batch }
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -324,7 +324,7 @@ class NamedScopeTest < ActiveRecord::TestCase
|
||||
Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
|
||||
end
|
||||
|
||||
assert_queries(3) do
|
||||
assert_queries(2) do
|
||||
Topic.approved.find_in_batches(:batch_size => 2) do |group|
|
||||
group.each {|t| assert t.approved? }
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user