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: limitの変更batch_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_each による内部使用のために予約されている :order と :limit を除いて、通常の find メソッドで許可されているほとんどのオプションを受け入れます。

したがって、使用できません:limit。いずれにせよ、ガイドには何か問題があると思いますfind_each。検索ではなく、ループに使用する必要があります。

ある時点で中断されたジョブ:startを再開するために使用されることにも注意してください(直接ではなく、2000 のような ID、たとえば 5000 のバッチ内の 2000 要素です)、ドキュメントの状態と同じように:

デフォルトでは、レコードは主キー (整数である必要があります) の昇順でフェッチされます。:start オプションを使用すると、最小 ID が必要な ID でない場合に、シーケンスの最初の ID を構成できます。これは、たとえば、最後に処理された ID をチェックポイントとして保存していれば、中断されたバッチ プロセスを再開する場合に役立ちます。

offsetおよびlimitメソッドを置き換えるために使用しないでくださいActiveRecord

于 2013-07-04T22:06:00.427 に答える