gem では、どのように設定すればよいでしょうか?
概要
コレクションが ActiveRecord::Relation を返す場合、各「バッチ」に制限を設定するにはどうすればよいでしょうか?ジョブ反復のベスト プラクティスによると、デフォルトは 100 です。高価なクエリや大規模なデータセットにとって、100 は小さすぎます。
ここに伝わったようです。
ただし、コレクション メソッドで maintenance_tasks gem を使用する場合、列挙子を明示的に構築しません。では、どのようにして @batch_size を渡したり、設定したりできるのでしょうか?私は、MaintenanceTasks::Task 内で @batch_size、@of、defbatch_size、def of などのいくつかの推測を試してみました。
解決策
maintenance_tasks gem には、@batch_size インスタンス変数を直接設定する方法がありません。ただし、コレクション メソッドの :batch_size オプションを指定して find_each メソッドを使用すると、バッチ サイズを制御できます。
タスクごとに異なるバッチ サイズを設定する場合は、各タスクの収集メソッドで find_each メソッドを :batch_size オプションとともに使用する必要があります。 find_each メソッドは、レコードのバッチを生成する Enumerator を返します。これは、maintenance_tasks gem が期待するものです。
find_each メソッドは ActiveRecord の一部であり、その機能は maintenance_tasks gem に直接関連していないことに注意してください。これはデータベースからレコードをバッチでフェッチするために使用され、大規模なデータセットを扱うときのパフォーマンスを向上させることができます。
以下は、収集メソッドでバッチ サイズを設定する方法の例です。
module Maintenance
class UpdatePostsThrottledTask < MaintenanceTasks::Task
throttle_on(backoff: 1.minute) do
DatabaseStatus.unhealthy?
end
def collection
Post.find_each(batch_size: 1000)
end
def process(post)
post.update!(content: "New content added on #{Time.now.utc}")
end
end
終わり