Rakeタスクを作り
どうもどハマりエンジニアです。
本日は簡単にRakeタスク について実装したので、まとめていきます。
記事ステータスの追加
まずenumのメソッドが使えるように定義していきます。
i18nの設定
state:
draft: '下書き'
published: '公開'
publish_wait: '公開待ち'
モデルの状況 article.rb
Rakeとは
そもそもRake
ですが、Rubyで書かれたコードをタスクとして作成しておき必要に応じて呼び出し実行する事が出来る機能です。
rake
タスクを利用する場面としては、こんなのが有ります。
- 何かしらのデータの連携
- データベースのバックアップ
- 定期的にデータを更新、削除する ←今回はこれ
Rakeタスクの処理を記述するファイルを作成します。
$ rails g task article_status
するとlib/tasks/article_status.rake
が生成されるのでこのファイルに書いていきます!
lib/tasks/article_status.rake
namespace :article_state do
desc '公開待ちの中で、公開日時が過去になっているものがあれば、ステータスを「公開」に変更されるようにする。'
task state_change: :environment do
Article.publish_wait.past_published.each{ |x| x.published! }
end
end
作ったrakeファイルを確認
$ rake -vT
実行する
$ rake task_sample:sample
DBに接続する場合
namespace :task_sample do
desc "task_sample_use_model"
task :task_model => :environment do
puts User.first().to_yaml #Userモデルを参照する!
end
end
上記を実行する
$rake task sample:task model
wheneverを使いcronを管理
Gemfile
gem 'whenever', require: false
下記を実行し、config/schedule.rbファイルを作成する。
$ bundle exec wheneverize .
wheneverでは次の4つをスケジューリングできます。
下記コマンドでインストールされているcronジョブを一覧表示
crontab -l .
config/schedule.rb
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
# cronを実行する環境変数をセット
# cronのログの吐き出し場所
every :houre do
rake 'article_status:update_article_state'
end
今回は1時間ごとに実行させたいので、上記のように設定。
以上でRakeタスクについての説明でした。