Skip to content

Commit

Permalink
Ensure ActiveRecord::Base.find_in_batches fires doesnt fire an extra …
Browse files Browse the repository at this point in the history
…query unless needed
  • Loading branch information
lifo committed Mar 11, 2009
1 parent f23adf0 commit 106976d
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 2 deletions.
5 changes: 4 additions & 1 deletion activerecord/lib/active_record/batches.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,15 @@ def find_in_batches(options = {})
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
Expand Down
12 changes: 12 additions & 0 deletions activerecord/test/cases/batches_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,16 @@ def test_find_in_batches_should_start_from_the_start_option
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
2 changes: 1 addition & 1 deletion activerecord/test/cases/named_scope_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ def test_named_scopes_batch_finders
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
Expand Down

0 comments on commit 106976d

Please sign in to comment.