rake task, cron,whenever② (whenever とcron)
Wheneverの書き方
前回設定したarticle_stateコマンドを1時間に一度実行されるようにするには、wheneverを活用します。(wheneverはざっくりcronをrubyに翻訳するgemって理解してます。)
db/schedule.rb
require File.expand_path(File.dirname(__FILE__) + '/environment')
# 使用例
rails_env = ENV['RAILS_ENV']|| :development
set :environment, rails_env
set :output, "#{Rails.root}/log/cron_log"
// 1時間に一度先ほど作成したrake taskが実行されるように定義している。
every :hour do
rake 'article_state:change_publish'
end
このコードがchange_publishが1時間に一度実行されることを示してる。
every :hour do
rake 'article_state:change_publish'
end
cronに反映させるためには、下記コードをターミナルで打つ。
$ bundle exec whenever --update-crontab
Enumを書く上でのポイント
enumに新しいメソッドを追加するときの注意点
article.rb
# 変更前
enum state: { draft: 0, published: 1}
# 変更後
#NG
enum state: { draft: 0, published: 1, publish_wait: 2 }
#OK
enum state: %i{ draft published publish_wait }
OKのコードの方が綺麗で見やすいため、%iを使って書くことが推奨されている。
Enumから値を持ってくるだけで良いので、記述がクリーンになる。
# NG
article.state = 'publish_wait'
Article.where(state: :publish_wait)
# OK
Article.publish_wait