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

时间:2015-05-23 22:39:11

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

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

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

我想要那个

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

以下是四个属性:

  • 地址行
  • 邮政编码
  • 状态
  • 国家

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

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

确实,当我尝试在4个属性验证中的一个上放置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

1 个答案:

答案 0 :(得分:1)

在我看来,它必须全部四个,或者都不是。未经测试,但这应该有效。

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将为真。