Ruby on rails 需要从验证写入数据库
在我的模型中,我有一个自定义的验证方法,可以将请求发送到外部服务。根据响应,我将错误添加到Ruby on rails 需要从验证写入数据库,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在我的模型中,我有一个自定义的验证方法,可以将请求发送到外部服务。根据响应,我将错误添加到errors数组(如果有) 如果有错误,我还需要创建表示错误日志的ErrorLog模型的新记录。问题是,当验证失败时,它会对数据库执行回滚,所有新的错误日志记录都会丢失。实施它的最佳方式是什么 我还应该说,由于某种原因,after\u rollback没有被调用。after\u rollback只在事务期间保存或销毁的对象上被调用。您是在主类上还是在ErrorLog类上设置after\u rollback回
errors
数组(如果有)
如果有错误,我还需要创建表示错误日志的ErrorLog
模型的新记录。问题是,当验证失败时,它会对数据库执行回滚
,所有新的错误日志
记录都会丢失。实施它的最佳方式是什么
我还应该说,由于某种原因,
after\u rollback
没有被调用。after\u rollback
只在事务期间保存或销毁的对象上被调用。您是在主类上还是在ErrorLog
类上设置after\u rollback
回调
事实上,对ErrorLog
类使用after_rollback
回调似乎是最简单的方法。您将丢失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
classmyclass'oops')
结束
结束
结束
类ErrorLog
当然,已经说过了所有可能要考虑获得外部服务来验证模型的性能。例如,如果您在web请求的范围内创建对象,则速度可能不够快。您还需要确保
ErrorLog#save
不会失败,因为此时您将超出事务范围。谢谢您的帮助。我理解我的错误,并在回滚后在ErrorLog
模型内部设置。但是self.save代码>什么都不要做。我在日志中有SQL(0.1ms)BEGIN\n SQL(0.1ms)COMMIT
,没有任何插入。我想知道它是否认为它已经保存了,因为它是在事务本身中“保存”的。您可能希望尝试对其调用touch
,或者更改一个属性,以查看该属性是否会推动保存进入生命。值得检查的是,登录到那里的用户肯定正在调用回调。仅使用ErrorLog.create!(self.attributes)我可以确认错误已被保存。这看起来像是肮脏的黑客,但我不知道,还能做什么。谢谢你的帮助。