【问题标题】:Rails 4 active record validation - conditionally validate presence of 4 attributes if at least one is present while allowing none to be presentRails 4 活动记录验证 - 如果至少有一个属性存在,则有条件地验证 4 个属性的存在,而不允许不存在
【发布时间】:2015-05-23 22:39:10
【问题描述】:

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

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

我想要那个

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

以下是四个属性:

  • address_line_1
  • 邮政编码
  • 状态
  • 国家

这意味着如果用户填写其中一个,那么所有其他人都必须在场。但如果都是空白,也可以。

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

确实,当我尝试将 allow_blank: true 放在 4 个属性之一验证时,它会中断 (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

【问题讨论】:

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


    【解决方案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 要么为真,要么全部为空,要么都不为空。

    【讨论】:

    • 它可能会起作用,但如果我应用它,我会收到一个错误:“您需要提供至少一个验证”,因为您不能只在没有任何条件的情况下进行活动记录(例如:存在:真,缺席:真......)这就是你在验证时所做的:all_or_none
    • 我写的是validate,而不是validates...validate 是自定义验证,不像validates 是关于特定字段或一组字段
    • 不起作用。我确实设法在填充 4 个中的 NONE 时验证从,但是当我只填充一个属性而将其他 3 个留空时,我不会收到错误,并且在不应该时验证表单(它应该引发错误) .
    • 我认为(不确定)您提出的建议是正确的,但它不起作用,因为 postgresql 通常不会看到空/空白值xenoterracide.com/2010/01/…。将追寻这条线索。
    • 工作了,这与 postgresql 无关,只是我使用的是 json 列并且需要使用 self.column_name 而不是 :column_name。交易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多