有没有办法让before_save过滤器在不停止事务的情况下暂停整个保存?我正在尝试做的是我的模型的“样本”版本,用户可以与之交互并保存,但更改本身从未实际保存过。当我调用@ model.update_attributes时,以下内容将暂停事务并自然地返回false:
before_filter :ignore_changes_if_sample
def ignore_changes_if_sample
if self.sample?
return false
end
end
谢谢!
答案 0 :(得分:1)
这正是这里发生的事情。如果你看看你的SQL,你应该看到BEGIN然后COMMIT,它们之间没有任何东西。 before_save不会暂停事务;它只是通过返回false来阻止记录被保存。
为了更一般地回答您的问题,无法持久的记录不会暂停交易,除非它们也引发异常。异常会触发ROLLBACK,以防止提交事务的任何部分。所以即使你在这里返回false,一个更大的,更重要的事务应该继续正常。
您可以在ActiveRecord::Transactions文档中阅读有关事务以及Rails如何使用它们的更多信息。