需要从验证中写入db

时间:2012-05-03 07:59:58

标签: ruby-on-rails ruby activerecord

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

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

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

1 个答案:

答案 0 :(得分: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不会失败,因为到那时您将不在事务范围之内。