如果ActiveRecord :: Base.transaction成功,请执行某些操作

时间:2016-03-07 17:21:32

标签: ruby-on-rails activerecord

如何检查ActiveRecord :: Base.transaction是否成功?

如果出现问题,我希望回滚发生,但我也想确保如果事务成功,我会做一些额外的逻辑。这是代码:

#...
ActiveRecord::Base.transaction do
  user_id = existing_ids.last || User.create(phone: phone_number)
  homes.update_all(user_id: user_id)
end

if transaction_was_success
  # do something
else 
  # do something else
end

1 个答案:

答案 0 :(得分:1)

要在成功完成交易后执行额外工作,您可以使用after_commit回调。

要在事务期间发生故障时触发回滚,请使用!方法。使用update_all方法的问题是它不会引发任何错误。 update_attribute!!方法,因此会在失败时引发错误。如果任何更新或创建失败,现在将回滚事务。

after_commit :successful_commit

ActiveRecord::Base.transaction do
  user_id = existing_ids.last || User.create!(phone: phone_number)
  homes.each do |home|
     home.update_attribute!(user_id: user_id)
  end

  # Or do other things here...
end

def successful_commit
   # Something on success here...
end