Railsでバッチ処理を1回だけ実行する
Wheneverでcronを定期的に実施する方法はよくやるが、一回だけのバッチ処理は忘れてしまうことがあるのでメモ。
例えばfoodテーブルのカロリー(calorie)未設定のレコードに対し、未設定フラグ(not_set)をたてる処理を1回のみ行うとする。
lib/tasks/calorie_set.rb
def self.test result = Food.where(:calorie => nil) result.each do |i| i.not_set = true i.save end end
本当はエラーケースなども用意したほうが良い。
バリデーションエラーなどで更新されないケースがあるからだ。
既にDBに入っているということはバリデーションにかからないのでは?と思う方もいるかもしれないが、バリデーションチェックをデータ挿入後に追加したなどの理由で不整合データがあることも考えられる。
そしてタスクが設定できたらこのコマンドを実行する。
bundle exec rails runner Tasks::RunnerTest.test
定期的に行う場合はwheneverでcron設定しよう。