Rakeタスクを作り

どうもどハマりエンジニアです。

本日は簡単にRakeタスク について実装したので、まとめていきます。

 

 

記事ステータスの追加

 

まずenumのメソッドが使えるように定義していきます。

i18nの設定

state:
  draft: '下書き'
  published: '公開'
  publish_wait: '公開待ち'

 

モデルの状況 article.rb

enum state: { draft: 0, published: 1, publish_wait: 2 }

 

 

 

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つをスケジューリングできます。
  • command: bashコマンド実行
  • rake: rakeタスク実行
  • runner: Rails内のメソッドを実行
  • script: scriptの実行

 

下記コマンドでインストールされているcronジョブを一覧表示

crontab -l .

 


config/schedule.rb

# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"

every :houre do
  rake 'article_status:update_article_state'
end

今回は1時間ごとに実行させたいので、上記のように設定。

 

 

以上でRakeタスクについての説明でした。