「Railsで定期的に実行したい処理を、lib/tasks以下のディレクトリに、rakeタスクを作成して処理を記述することが多い。」という話を聞いてrakeタスク??となったので、調べました。
以下にまとめて記載します。
#そもそもrakeとは
rake:Rubyで書かれたコードをタスクとして作成しておき、必要に応じて呼び出し実行する事が出来る機能です。
#rakeタスク
アプリケーションを起動せず、行いたい処理をCUI(コマンドプロンプトやターミナル)から実行でき、サーバーを起動せず任意の処理を実行できます。
つまり、冒頭のコメントにある”Railsで定期的に実行したい処理”をrakeタスクを作成して処理するというのは、例えば、以下のようなときに使えます。
- 何かしらのデータの連携
- データベースのバックアップ
- 定期的にデータを更新、削除する
#rakeタスクの使い方
##1.Rakeタスクファイルを生成
まず、処理を記載するためのrakeファイルを作成します。
$ rails g task ファイル名
上記コマンドを実行するとlib/tasks以下のディレクトリにファイルが生成されます。
それでは、早速処理の内容を記述していきましょう。
##2.処理内容の記述
今回は例として以下の記述を入れます。
処理内容:ユーザーが入店したかどうかを管理する"enterd_flag"というカラムをfalseにする
処理内容の記述箇所
namespace:生成したファイル名を記述します。*今回、以下では[user]とします。
desc:実行する処理の説明を記述します。
task:タスクの名前を記述します。
#モデルにアクセスする場合は :environmentの指定が必要です。
namespace :user do
desc "ユーザーの入店情報をリセットする"
task reset_entered_flag: :environment do
User.update_all(entered_flag: false)
end
end
##3.処理の実行
この処理を実行するには、以下のようにターミナルでコマンド入力することで実行できます。
#rake [namespeceの名前]:[taskの名前]
$ rake user:reset_entered_flag
#追加機能(定期的な処理を行うとき)/gem:wheneverの使用
今回のような処理を定期的に実行するときにはgem:wheneverを使うと実装できます。
wheneverはcrontab管理ライブラリです。
Crontab:UNIX系のOS(Linux,Macなど)で使えるcronを動かすためのコマンド。
Cron:UNIX系のOS(Linux、Macなど)でタイミングを指定しておき、そのタイミングになったら、このプログラムを動かしてくれるもの
詳細は、以下確認ください。
https://wa3.i-3-i.info/word11748.html
##1.wheneverのインストール
gem 'whenever', require: false
=>bundle install
*アプリケーションから使わないgemは require: false を付けます。
例えばcapistrano、rubocop、unicorn 等、今回もアプリケーションから使用しないため、require: false をつけます。
メリット
- 読み込まないようにして起動を少しでも早くする
- 想定外の挙動を減らす
##2.whenever設定ファイルschedule.rbを作成
まず、wheneverの設定するファイルを作成します。
$ bundle exec wheneverize
> [add] writing `./config/schedule.rb'
> [done] wheneverized!
作成できたら、以下のように記述をしていきましょう。
実行するものは以下のいずれかを使用することで実行できます。
- command: bashコマンド実行
- rake: rakeタスク実行
- runner: Rails内のメソッド実行
- script: scriptの実行
# 出力先のログファイルの指定
set :output, 'log/crontab.log'
# ジョブの実行環境の指定
set :environment, :production
# 3時間毎に実行するスケジューリング
every 3.hours do
rake 'my:rake:task'
end
##3.Crontabへの設定
上記で設定した内容をCromtabに設定しましょう。
$ bundle exec whenever --update-crontab
以上で設定完了です。
Capistranoで本番環境にも簡単に設定できるようですので、気になる方は以下の参照ご確認の上、ご対応ください!
#参照
【Ruby on Rails】Rakeタスクを使えば様々な処理が自動化出来る?(初心者向け)
https://opiyotan.hatenablog.com/entry/rails-rake-task
javan/whenever
https://github.com/javan/whenever
Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails 4.2 x Ruby 2.3]
https://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/index.html#Corntab%E3%81%B8%E3%81%AE%E8%A8%AD%E5%AE%9A
gemのwheneverを導入してみた
http://shiro-16.hatenablog.com/entry/2015/02/17/000715
Railsで定期的にバッチ回す「Whenever」
https://qiita.com/yumiyon/items/388fbb84450f49a6ab0d
以上となります。最後までご覧いただき、ありがとうございました!
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。