2014年9月15日月曜日

俺的メモ:RailsでCronで動かすバッチ処理を書きたい。でもActiveRecordは使いたい。

RailsなWebアプリケーションフレームワークでcronで動かす前提なバッチ処理プログラムを書くという変態奇特な方がいらっしゃったのでメモ。

【Rails】バッチ処理を実装したいけどActiveRecordを中で使ったりもしたいし


RAILS_ROOT/lib/tasks/直下にdel_user.rbってな感じで作成する(実は/lib配下ならどこでもいい)
実行は

rails runner Tasks::DelTmpUsers.execute

な感じ。
クラス名は、/lib/に作成したディレクトリ名の先頭大文字にしたもの::Hogehogeって名前にしないといけない。

例えば、/lib/crontask/hogehoge.rbに配置したら、
クラス名は
Crontask::Hogehoge
になる。

注意点は、モデルクラスの読み込みはされないので、使うモデルはrequireしないといけない。

3 件のコメント:

  1. lib/tasksは rake する際に自動でよみこいするディレクトリだから task として実装すれば

    $ rake task名

    で実行できますよよ。

    rails runner を使う場合はモデルクラスつくってクラスメソッドにすれば

    $ rails runner クラス名.メソッド名

    で呼べるのでこっちのほうがわかりやすいっすよ。

    返信削除
  2. 具体例があるのでついでにあげとこう。gaba.eiel.infoは1日1度の定時実行がある

    $ bin/rails runner 'Topic.create_topic_from_website'

    で実行できるようにしてて中身は

    https://github.com/eiel/gaba.eiel.info/blob/master/app/models/topic.rb#L12-L18

    def self.create_topic_from_website
    Gaba.new.to_hash.each do |topic|
    find_or_create_by!(id: topic[:artcile_id],
    title: topic[:title],
    created_at: topic[:date])
    end
    end

    返信削除
    返信
    1. modelから呼べるんですね。
      調べてみました。
      http://guides.rubyonrails.org/command_line.html#rails-runner
      これだと、いちいちmodelをrequireしなくても良さそうですね。

      具体例も上げて下さり、勉強になります。

      削除