如何验证Rails中是否存在关联值?

时间:2018-01-08 05:15:37

标签: ruby-on-rails validation activerecord

我想验证user.company.aum_id。我有

class User < ApplicationRecord
  belongs_to :company
  validates_associated :company
  accepts_nested_attributes_for :company, :image

class Company < ApplicationRecord
  has_one :user
  validates :aum_id, presence: true, if: 'user.provider?'

但它一直在我的测试中给出这个错误

  

NoMethodError(未定义的方法`provider?'代表nil:NilClass):

我不想用user && user.provider?来解决错误。如何检查关联记录是否具有该值,但仅当用户方法#provider?为真时?就像没有设置company.user一样。它工作正常,值没有验证器保存。

我考虑在User中添加自定义验证器,但看起来您只能在同一模型中指定符号。

http://guides.rubyonrails.org/v5.0/active_record_validations.html#custom-methods

我试过

class User < ApplicationRecord
  include ActiveModel::Validations
  validates_with AumValidator
app/validators/aum_validator.rb ???路径???
class AumValidator < ActiveModel::Validator
  def validate(user)
    if user.provider? && user.company.aum_id.blank?
      user.errors[:aum_id] << 'Assets Under Management is required.'
    end
  end
end

但它给出了错误

  

未初始化的常量User :: AumValidator

Rails 5.0.6

2 个答案:

答案 0 :(得分:2)

请尝试使用自定义验证

class User < ApplicationRecord
  validate :company_aum_id_present, if: :provider?

  private def company_aum_id_present
    self.errors[:aum_id] << 'Assets Under Management is required.' if company && company.aum_id.blank?
  end
end

此外,当使用自定义验证程序时,您不需要包含ActiveModel::Validations,因为它已包含在ApplicationRecord

答案 1 :(得分:-1)

class Company < ApplicationRecord
  has_one :user
  validates :user
  validates :aum_id, presence: true, if: -> { user.provider? }
end

在validate方法中使用->(lambda)使得每次运行验证时都会对其进行评估。

这假定User实现了provider?方法或具有名为provider的属性。

还要求CompanyUser