在我的模型中,我有自定义验证方法,可以向外部服务发送请求。根据响应,我向errors
数组添加了错误(如果有的话)。
如果有错误,我还需要创建ErrorLog
模型的新记录,这些记录代表错误日志。问题是,当验证失败时,它会对数据库执行ROLLBACK
,并且所有新的ErrorLog
记录都将丢失。实施它的最佳方法是什么?
我还应该说after_rollback
由于某种原因没有被调用。
答案 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
不会失败,因为到那时您将不在事务范围之内。