Rails 4 个活动记录验证 - 如果至少存在一个属性,则有条件地验证是否存在 4 个属性,同时允许 none 存在

Rails 4 active record validation - conditionally validate presence of 4 attributes if at least one is present while allowing none to be present

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

其中我有 4 个属性,我需要应用我所谓的 "mutually conditional presence" 活动记录验证。

我想要那个

以下是四个属性:

这意味着如果用户填写其中一个,那么所有其他人都必须存在。但是如果全是空的就ok了。

到目前为止,我只能设法执行 (A)。但是我没有实现(B)。

事实上,当我尝试将 allow_blank: true 放在 4 个属性之一上进行验证时,它会中断 (A) ,因为在那之后,它不能确保是否存在一个属性,其他人也必须如此。

如何操作?

这是我当前的代码

spec/models/users

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

在我看来,它必须是所有四个或 none。未经测试,但这应该有效。

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 如果所有四个字段都为空或者其中 none 为真。