3

before_save 过滤器有没有办法在不停止事务的情况下停止整个保存?我想要做的是拥有我的模型的“样本”版本,用户可以与之交互并保存,但更改本身从未真正保存。当我调用@model.update_attributes 时,以下将停止事务并(自然)返回 false:

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

谢谢!

4

1 回答 1

1

这正是这里发生的事情。如果您查看您的 SQL,您应该看到 BEGIN 和 COMMIT,它们之间没有任何内容。before_save 不会停止交易;它只是通过返回 false 来防止记录被保存。

为了更普遍地回答您的问题,无法持久的记录不会停止事务,除非它们也引发异常。异常触发 ROLLBACK 阻止事务的任何部分被提交。因此,即使您在此处返回 false,更大的总体事务也应该继续正常进行。

您可以在ActiveRecord::Transactions文档中阅读有关事务以及 Rails 如何使用它们的更多信息。

于 2012-06-28T15:13:57.313 回答