1

在我的模型中,我有向外部服务发送请求的自定义验证方法。根据响应,我将错误添加到errors数组中(如果有)。

如果有错误,我还需要创建新的ErrorLog模型记录,代表错误日志。问题是,当验证失败时,它会ROLLBACK在数据库上执行,并且我所有的新ErrorLog记录都丢失了。实施它的最佳方法是什么?

我也应该说after_rollback由于某种原因没有被调用。

4

1 回答 1

3

after_rollback仅在事务期间保存或销毁的对象上调用。after_rollback你是在你的主课上还是在你的课上设置回调ErrorLog

事实上,after_rollback在你的类上使用回调ErrorLog似乎是最简单的方法。您将丢失ErrorLog实例的唯一情况是事务被回滚,所以这样的事情应该可以工作:

class MyClass < ActiveRecord::Base
  before_save :check_external

  def check_external
    unless external_says_i_am_okay?
      ErrorLog.create!(:message => 'oops')
    end
  end
end

class ErrorLog < ActiveRecord::Base
  after_rollback :save_anyway

  def save_anyway
    self.save!
  end
end

当然,说了这么多,您可能需要考虑获取外部服务来验证模型的性能。例如,如果您在 Web 请求的范围内创建对象,它可能不够快。您还需要确保ErrorLog#save不会失败,因为此时您将超出事务的范围。

于 2012-05-03T08:24:32.860 回答