如果人不属于公司,如何验证人的地址?

时间:2018-02-15 07:01:55

标签: ruby-on-rails ruby validation activerecord

在我的Rails 5应用程序中,我有以下设置:

class Client < ApplicationRecord

  has_one :address, :as => :addressable, :dependent => :destroy

  accepts_nested_attributes_for :address, :allow_destroy => true

end
class Company < Client

  has_many :people

end
class Person < Client

  belongs_to :company

end
class Address < ApplicationRecord

  belongs_to :addressable, :polymorphic => true

  validates :city,        :presence   => true
  validates :postal_code, :presence   => true

end

person 可以属于company,但不一定非必要。

现在我想验证一个人的地址,只有当该人不属于某个公司时。怎么办呢?

3 个答案:

答案 0 :(得分:3)

也可能有其他方法,但根据我的经验,这样的事情应该有用。

validates :address, :presence => true, if: -> {!company}

希望这有帮助。

答案 1 :(得分:2)

Nabin的答案很好,但想表现出另一种方式。

validate :address_is_present_if_no_company

def address_is_present_if_no_company
  return if !company_id || address
  errors.add(:address, "is blank")
end

答案 2 :(得分:2)

验证可以采用ifunless参数,该参数接受方法,proc或字符串以确定是否运行验证。

在你的情况下:

validates :address, presence: true, unless: :company

根据评论更新 以上只关注跳过验证本身,但由于accepts_nested_attributes_for OP在尝试保留缺少的地址时仍然看到错误。这解决了它:

accepts_nested_attributes_for :address, reject_if: :company_id