2016-03-07 68 views
1

如何檢查ActiveRecord :: Base.transaction是否成功?如果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 
+0

交易的上下文是什麼?你把這個放在哪裏? – SacWebDeveloper

回答

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