Rake タスクについて
Rake Task
Rake タスク
を触ったので、やったことをまとめてみました。
Rake タスクを作成する
$ bundle exec rails g task sample
上記コマンドを実行すると、 以下のようなファイルが作成されます。
# lib/tasks/sample.rake
namespace :sample do
end
lib/tasks/sample.rake を変更
# lib/tasks/sample.rake
namespace :sample do
desc 'idが128と256のユーザを削除'
task user_destroy: :environment do
ActiveRecord::Base.transaction do
User.find(128).destroy!
User.find(256).destroy!
end
end
end
:environment
はDB
アクセスするときや Rake タスク
などで必要らしいです。
自分は、:environment
をすべてのタスクにつけています。
# lib/tasks/sample.rake
~
task user_destroy: :environment do
...
end
~
囲まれた ...
の中の処理で例外が起きるとロールバックします。
ロールバック: ここで言うと、下記の
ActiveRecord::Base.transaction
で囲まれた部分の処理が、処理が行われる前の状態に戻ることです。
# lib/tasks/sample.rake
~
ActiveRecord::Base.transaction do
...
end
~
destroy!
は、destroy
できなかったときに例外を投げます。
よって、destroy
できなかったときはロールバックされます。
次のようなデータを 1 つしか扱わないときは、
ロールバックをしても意味がないので、
ActiveRecord::Base.transaction
で囲む必要はないです。
User.find(id: 128).destroy!
データを複数扱う場合は、
ActiveRecord::Base.transaction
で囲むべきです。
下記の内容を囲んでいた場合、id
が 128
のユーザを消して、id
が 256
のユーザが消せなかったときに、囲まれた処理がロールバックされるので、 id
が 128
のユーザは削除されていない状態に戻ります。
User.find(128).destroy!
User.find(256).destroy!
作成した Rake タスクを確認する
$ bundle exec rake -vT
rake sample:user_destroy # idが999のユーザを削除
Rake タスクを実行する
$ bundle exec rake sample:user_destroy
Rake タスクを削除する場合
$ bundle exec rails d task sample