LoginSignup
0
0

More than 3 years have passed since last update.

Transactionの中で意図的にロールバックさせたい

Posted at

ActiveRecord::Base.transactionはとっても便利です
save!メソッドなどの例外を拾ってロールバックを自動でかけてくれます
トランザクションの中でロールバックを意図的にかけたいときがあると思います

ダメな例

begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::Rollback # ロールバックは実行される
    end   
  end
rescue e => 
  # ここは実行されない
  Rails.logger.error(e)
end

良い例

ActiveRecord::RecordNotSavedでもロールバックが走るため、こちらを例外として投げてあげると、
rescueでキャッチすることができる

begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::RecordNotSaved
    end   
  end
rescue e => 
  # 実行される
  Rails.logger.error(e)
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0