Rails 4活动记录validation – 如果存在至少一个属性而有条件地validation4个属性的存在,同时不允许存在

我有一个包含10个属性的表单。

其中我有4个属性,我需要应用我称之为“互为条件存在”的Active Recordvalidation。

我要那个

  • (A)如果至少存在一个,则必须存在另外3个
  • (B)仍然不允许存在(如果其他3为空白,则第四个有空白)

以下是四个属性:

  • 地址第一行
  • 邮政编码
  • 国家

这意味着如果用户填写其中一个,那么所有其他人必须在场。 但如果一切都是空白的,那没关系。

到目前为止,我只能设法强制执行(A)。 但我未能实施(B)。

实际上,当我尝试在4个属性validation中的一个上使用allow_blank:true时,它会中断(A),因为在此之后,它不能确保如果存在属性,则其他属性也必须如此。

这该怎么做?

这是我目前的代码

规格/型号/用户

validates :address_line_1, presence: true, if: :pa_subelements_mutual_presence? length: { maximum: 100, minimum: 3 } validates :zipcode, presence: true, if: :pa_subelements_mutual_presence?, length: { maximum: 20, minimum: 4} validates :state, presence: true, if: :pa_subelements_mutual_presence?, validates :country, presence: true, if: :pa_subelements_mutual_presence?, length: { maximum: 50} private def pa_subelements_mutual_presence? # method to help set validates on mutually dependent for presence for postal address lambda { self.address_line_1.present? } || lambda { self.zipcode.present? } || lambda { self.state.present? } || lambda { self.country.present? } end 

在我看来,它必须是全部四个或没有一个。 没有测试,但这应该工作。

 validate :all_or_none private def all_or_none errors[:base] << "all or nothing, dude" unless (address_line_1.blank? && zipcode.blank? && state.blank? && country.blank?) || (!address_line_1.blank? && !zipcode.blank? && !state.blank? && !country.blank?) end 

如果所有四个字段都是空白或者都不是,则all_or_none将为true。