Ruby ActiveRecord:DEPRECATION WARNING:不推荐使用带有finder选项的Relation#find_in_batches

时间:2013-07-04 20:32:37

标签: ruby activerecord

我正在实施这里提到的Model.find_each:

http://edgeguides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches

但我收到此错误消息:

Ruby ActiveRecord: DEPRECATION WARNING: Relation#find_in_batches with finder options is deprecated. Please build a scope and then call find_in_batches on it instead.

代码:

Person.find_each(start: start_index, limit: limit) do |person|

我几乎遵循文档中给出的代码,所以我有点困惑。这段代码是否正确,如果没有,那该修复是什么?

2 个答案:

答案 0 :(得分:1)

更改limit: limit

batch_size: limit

修改

由于您需要限制且批次基于ID,我认为您可以执行以下操作:

Person.where("id < ?", (start_index + limit)).find_each(start: start_index) do |person|

答案 1 :(得分:0)

我没有得到确切的问题,但我认为你可以写下这个:

Person.offset(start_index).limit(limit).find_each(batch_size: NUMBER) do |person|

find_each只是each的替代品,这是你应该对查询做的最后一件事,你应该只使用它来选择将在内存中加载多少结果({{1} })。

对于偏移/限制,您应该使用通常的查询API。 重要提示:请注意batch_sizefind_each无关,find替换find_each,这应该用于循环记录,而不是查找/过滤/还有什么。

此外,明确写在指南中:

  

find_each方法接受大多数允许的选项   常规查找方法,除了:order和:limit,保留   供find_each内部使用。

所以你不能使用each。在任何情况下,我认为指南中存在错误:您应该使用:limit进行循环,而不是搜索。

另请注意,find_each用于在某个时刻重新启动中断的作业(它不是直接的,ID就像2000,例如5000个批次中的2000个元素),很像文档说:

  

默认情况下,记录按主键的升序提取,   必须是整数。 :start选项允许您配置   每当最低ID不是你的那个时,序列的第一个ID   需要。这将是有用的,例如,如果你想恢复一个   如果您将上次处理的ID保存为,则中断批处理   检查站。

您不应该使用它来替换{​​{1}}

中的:startoffset方法