0

我正在实施这里提到的 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|

我几乎遵循文档中给出的代码,所以我有点困惑。此代码是否正确,如果不正确,解决方法是什么?

4

2 回答 2

1

更改limit: limitbatch_size: limit

编辑

由于您需要一个限制并且您的批次基于 id,我认为您可以执行以下操作:

Person.where("id < ?", (start_index + limit)).find_each(start: start_index) do |person|
于 2013-07-04T20:40:42.560 回答
0

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

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

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

对于偏移量/限制,您应该使用通常的查询 API。 重要提示:请注意,与, replacesfind_each无关,它应该用于循环记录,而不是查找/过滤/其他。findfind_eacheach

此外,指南中清楚地写着:

find_each 方法接受常规 find 方法允许的大部分选项,除了 :order 和 :limit,它们保留供 find_each 内部使用。

所以你不能使用:limit. 无论如何,我认为指南中有问题:您应该使用find_eachfor 循环,而不是用于搜索。

另请注意,:start它用于在某个时候重新启动中断的作业(它不是直接的,并且 id 像 2000,它是一批 5000 中的 2000 元素),就像文档状态:

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

你不应该用它来替换offsetlimit方法ActiveRecord

于 2013-07-04T22:06:00.427 回答