我正在实施这里提到的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|
我几乎遵循文档中给出的代码,所以我有点困惑。这段代码是否正确,如果没有,那该修复是什么?
答案 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_size
与find_each
无关,find
替换find_each
,这应该用于循环记录,而不是查找/过滤/还有什么。
此外,明确写在指南中:
find_each方法接受大多数允许的选项 常规查找方法,除了:order和:limit,保留 供find_each内部使用。
所以你不能使用each
。在任何情况下,我认为指南中存在错误:您应该使用:limit
进行循环,而不是搜索。
另请注意,find_each
用于在某个时刻重新启动中断的作业(它不是直接的,ID就像2000,例如5000个批次中的2000个元素),很像文档说:
默认情况下,记录按主键的升序提取, 必须是整数。 :start选项允许您配置 每当最低ID不是你的那个时,序列的第一个ID 需要。这将是有用的,例如,如果你想恢复一个 如果您将上次处理的ID保存为,则中断批处理 检查站。
您不应该使用它来替换{{1}}
中的:start
和offset
方法