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