ActiveRecord before_save过滤器可以在不停止事务的情况下暂停保存吗?

时间:2012-06-28 14:54:19

标签: ruby-on-rails

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

这正是这里发生的事情。如果你看看你的SQL,你应该看到BEGIN然后COMMIT,它们之间没有任何东西。 before_save不会暂停事务;它只是通过返回false来阻止记录被保存。

为了更一般地回答您的问题,无法持久的记录不会暂停交易,除非它们也引发异常。异常会触发ROLLBACK,以防止提交事务的任何部分。所以即使你在这里返回false,一个更大的,更重要的事务应该继续正常。

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