22

简单的问题。我有一个 ActiveRecord 模型,我想在保存记录后执行后期处理。因此,在模型中,我有一个 queue_for_processing 方法,可以将作业粘贴到我的 Resque 队列中。为了在我的记录成功保存后执行此操作,我在模型中编写了以下内容:

after_create :queue_for_processing

很简单。我原以为一切都按预期工作,除了昨晚我的 redis 服务器出现故障并且事情出了差错。我的期望是记录仍然会被保存,我可以稍后手动处理这项工作。但是 queue_for_processing 方法抛出异常(预期行为)并停止保存记录。

我是否误解了 after_create 的工作原理?还是我的理解正确并且发生了一些奇怪的事情?

谢谢。

4

1 回答 1

43

是的,回调都包含在事务中。

基本上,以下将导致回滚:

  • before_save从或类似的回调中返回 false
  • before_save或类似回调中的异常
  • 或类似回调中的异常after_save(after_create)

以下不会导致回滚:

  • after_save从或类似的回调中返回 false
  • 例外after_commit

如果您不希望异常导致回滚,请使用after_commit

于 2012-09-03T02:13:29.020 回答