Ruby on rails 模型验证失败,但已创建
我现在面临一个问题很久了。我的代码如下:Ruby on rails 模型验证失败,但已创建,ruby-on-rails,ruby,activerecord,activemodel,Ruby On Rails,Ruby,Activerecord,Activemodel,我现在面临一个问题很久了。我的代码如下: class BrokenModel < ActiveRecord::Base validates_with BrokenValidator has_many :association_name end class BrokenValidator < ActiveModel::Validator def validate record @record = record check_alerted end
class BrokenModel < ActiveRecord::Base
validates_with BrokenValidator
has_many :association_name
end
class BrokenValidator < ActiveModel::Validator
def validate record
@record = record
check_alerted
end
private
def check_alerted
return if @record.association_name.to_a.empty?
alerted = <test for alerted>
if alerted
@record.errors[:base] << "It was alerted recently"
end
p "check_alerted: #{@record.errors[:base]}"
end
end
在我上次打印的日志中,is显示验证只通过了一次,但实际上我为该模型创建了多个条目,其中关联\u name
存在
我的环境在多个线程和多个内核中运行此功能,但由于条目的创建间隔为几分钟,因此这不是并发问题,除非分离线程中的异常影响模型创建
出于好奇,这是在一个Sidekiq工人身上运行的
编辑
所以我在日志中注意到,这可能是一个并发问题。下面是正在发生的事情:
- 实例1验证:最近发出警报:失败(最近发出警报)
- 实例2验证:最近发出警报:已通过
- 实例2验证:其他验证:失败(其他验证)
- 实例2创建错误:最近发出警报+其他验证
- 实例1创建错误:无
如果ActiveModel::Validator中存在任何类型的线程不安全,或者@record可能被其他线程覆盖/共享,那么有没有线索?向记录添加错误不会使其无效。事实上,在保存之前验证模型时,所有以前的错误(包括您在代码中添加的错误)都会被删除 在模型中执行此验证。。。不在工人的房间里
validate :check_alerted
def check_alerted
return if association_name.to_a.empty?
alerted = test
if <test for alerted>
errors.add(:base, "It was alerted recently")
end
end
validate:检查是否发出警报
def check_已报警
如果关联\u name.to\u a.为空,则返回?
警报=测试
如果
错误。添加(:base,“最近收到警报”)
结束
结束
向记录中添加错误不会使其无效。事实上,在保存之前验证模型时,所有以前的错误(包括您在代码中添加的错误)都会被删除
在模型中执行此验证。。。不在工人的房间里
validate :check_alerted
def check_alerted
return if association_name.to_a.empty?
alerted = test
if <test for alerted>
errors.add(:base, "It was alerted recently")
end
end
validate:检查是否发出警报
def check_已报警
如果关联\u name.to\u a.为空,则返回?
警报=测试
如果
错误。添加(:base,“最近收到警报”)
结束
结束
对不起,代码不完整。创建在Sidekiq中运行,但验证在模型中。只是解决了这个问题。它在模型中,但您指的是一个实例变量@record
?这不是正确的答案,尽管它很有用,我认为问题在于我的日志搜索。很抱歉,代码不完整。创建在Sidekiq中运行,但验证在模型中。只是解决了这个问题。它在模型中,但你指的是一个实例变量@record
?它不是正确的答案,虽然它很有用,我认为问题在于我的日志搜索。什么意思
,你能解释一下吗?它是一种在redis中检查存在和ID的方法。它没有那么有用,因为如果该方法返回错误的值,它可能会引发异常或到达check\u alerted log empty。是否有可能在验证阶段关联\u name为空,并在持久性周期中稍后填充,即使它被注入create命令?这是什么意思,pls?这是一种在redis中检查是否存在和ID的方法。它没有那么有用,因为如果该方法返回错误的值,它将引发异常或到达check_alerted log empty。在验证阶段,关联名称是否可能为空,并在持久性周期的后期填充,即使它被注入create命令中?