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

Rakeタスクの実装 - Qiita

ActiveModel::AttributeAssignment

rails learning rake task, cron, whenever