ENGINEERING&RUN

26.2マイルを走る僕の旅

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設定しよう。