2012-06-28 35 views
3

before_save過濾器是否有任何方式來暫停整個保存而不暫停事務?我想要做的是有一個「示例」版本的模型,用戶可以與之交互並保存,但這些更改本身從未實際保存過。當我打電話給@ model.update_attributes時,以下將暫停交易並(自然地)返回false:活動記錄before_save過濾器可以暫停保存而不停止事務嗎?

before_filter :ignore_changes_if_sample 
def ignore_changes_if_sample 
    if self.sample? 
    return false 
    end 
end 

謝謝!

回答

1

這正是這裏發生的事情。如果你看看你的SQL,你應該看到BEGIN然後COMMIT,而沒有它們之間的任何東西。 before_save沒有停止交易;它只是通過返回false來防止記錄被保存。

要更普遍地回答你的問題,無法堅持的記錄不會暫停交易,除非它們也引發異常。異常會觸發ROLLBACK,以防止事務的任何部分被提交。所以即使你在這裏返回錯誤,一個更大的總體交易也應該繼續下去。

您可以閱讀更多關於交易以及Rails在ActiveRecord::Transactions文檔中如何使用它們的信息。

+0

我看到它雖然回滾事務。 –