rakeタスクを設定する【rails】

はじめに

rakeタスクはアプリケーションを起動せずに、ターミナルなどから行いたい処理を実行できます。

rakeタスクの設定方法

まず、rakeタスクの処理を設定するためのファイルを作成します。

$ rails g task <タスクの名前>

$ rails g task update_article

上記のコマンドを実行すると、

lib/tasks配下にupdate_article.rakeというファイルが作成されます。

ファイルにはデフォルトで下記のようになっています。

namespace :update_article do
end

タスクの定義の仕方は以下の通りです。

namespace :update_article do
  desc 'タスクの説明'
  task <タスクの名前:> :environment do  # データベースへの問い合わせがある場合は:environmentをつける
    '実行したい処理'
  end

今回は、stateカラムが’公開待ち’かつ、公開日時が過去の記事があれば、

その記事のstateカラムを’公開’に変更するというtaskを作ります。

namespace :update_article do
  desc '公開待ち状態かつ、公開日時が過去の記事があれば公開に変更する'
  task change_status: :environment do
    Article.publish_wait.past_published.find_each(&:published!)
  end
end

publish_waitメソッドは、enumによって使用できるようになるメソッドです。

enumenum_i18nでstateカラムのpublish_waitは’公開待ち’、publishedは’公開’と設定しています。

このとき、Article.publish_waitとすると、stateカラムが公開待ちの記事のみを取得してきてくれます。

つまり、whereメソッドと同じ働きをしてくれます。

past_publishedはモデル側で定義しているメソッドで、公開日時が過去の記事だけを取得してきます。

find_eachは全データを取得した後に、少しずつ分割して処理をしてくれるメソッドです。

(&:published!)は、find_eachの処理の部分で、下記とイコールです。

find_each { |a| a.published! }

published!メソッドもenumによって使用できるメソッドで、

この場合、stateカラムをpublished(公開)に変更してくれます。

これでrakeタスクの設定は完了です。

$ rake -T

上記コマンドを実行すると、設定されているrakeタスクが一覧で表示されます。

下記のような表示があれば、タスクが設定できています。

rake update_article:change_status

設定したタスクを実行するには、先程確認したときに表示されたコマンドをそのまま打ちます。

$ rake update_article:change_status