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