Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 模型验证失败,但已创建_Ruby On Rails_Ruby_Activerecord_Activemodel - Fatal编程技术网

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命令中?