【Rails】バッチ処理を実装したいけどActiveRecordを中で使ったりもしたいし
RAILS_ROOT/lib/tasks/直下にdel_user.rbってな感じで作成する(実は/lib配下ならどこでもいい)
実行は
実行は
rails runner Tasks::DelTmpUsers.execute
な感じ。
な感じ。
クラス名は、/lib/に作成したディレクトリ名の先頭大文字にしたもの::Hogehogeって名前にしないといけない。
例えば、/lib/crontask/hogehoge.rbに配置したら、
例えば、/lib/crontask/hogehoge.rbに配置したら、
クラス名は
Crontask::Hogehoge
になる。
注意点は、モデルクラスの読み込みはされないので、使うモデルはrequireしないといけない。
lib/tasksは rake する際に自動でよみこいするディレクトリだから task として実装すれば
返信削除$ rake task名
で実行できますよよ。
rails runner を使う場合はモデルクラスつくってクラスメソッドにすれば
$ rails runner クラス名.メソッド名
で呼べるのでこっちのほうがわかりやすいっすよ。
具体例があるのでついでにあげとこう。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
modelから呼べるんですね。
削除調べてみました。
http://guides.rubyonrails.org/command_line.html#rails-runner
これだと、いちいちmodelをrequireしなくても良さそうですね。
具体例も上げて下さり、勉強になります。