在我的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
,但不一定非必要。
现在我想验证一个人的地址,只有当该人不属于某个公司时。怎么办呢?
答案 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)
验证可以采用if
或unless
参数,该参数接受方法,proc或字符串以确定是否运行验证。
在你的情况下:
validates :address, presence: true, unless: :company
根据评论更新
以上只关注跳过验证本身,但由于accepts_nested_attributes_for
OP在尝试保留缺少的地址时仍然看到错误。这解决了它:
accepts_nested_attributes_for :address, reject_if: :company_id