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によって使用できるようになるメソッドです。
enumとenum_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