# 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

:environmentDB アクセスするときや 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 で囲むべきです。

下記の内容を囲んでいた場合、id128 のユーザを消して、id256 のユーザが消せなかったときに、囲まれた処理がロールバックされるので、 id128 のユーザは削除されていない状態に戻ります。

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

# 参考