Permalink
Browse files

corrected AR find_each and find_in_batches to raise when the user use…

…s select but does not specify the primary key

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information...
1 parent 06eaf27 commit 231d7676f72947bae765b9bd885b134aaf949921 @joshk joshk committed with josevalim May 9, 2010
Showing with 22 additions and 1 deletion.
  1. +8 −1 activerecord/lib/active_record/relation/batches.rb
  2. +14 −0 activerecord/test/cases/batches_test.rb
@@ -67,11 +67,18 @@ def find_in_batches(options = {})
relation = relation.except(:order).order(batch_order).limit(batch_size)
records = relation.where(primary_key.gteq(start)).all
+ key_value = self.primary_key.name
+
while records.any?
yield records
break if records.size < batch_size
- records = relation.where(primary_key.gt(records.last.id)).all
+
+ last_value = records.last.send(key_value)
+
+ raise "You must include the primary key if you define a select" unless last_value.present?
+
+ records = relation.where(primary_key.gt(last_value)).all
end
end
@@ -17,6 +17,20 @@ def test_each_should_excecute_one_query_per_batch
end
end
+ def test_each_should_raise_if_select_is_set_without_id
+ assert_raise(RuntimeError) do
+ Post.find_each(:select => :title, :batch_size => 1) { |post| post }
+ end
+ end
+
+ def test_each_should_execute_if_id_is_in_select
+ assert_queries(4) do
+ Post.find_each(:select => "id, title, type", :batch_size => 2) do |post|
+ assert_kind_of Post, post
+ end
+ end
+ end
+
def test_each_should_raise_if_the_order_is_set
assert_raise(RuntimeError) do
Post.find_each(:order => "title") { |post| post }

0 comments on commit 231d767

Please sign in to comment.