【问题标题】:Validate Presence Of At Least One of Several验证至少存在几个
【发布时间】:2013-08-21 09:00:49
【问题描述】:

我有一个具有以下三个属性的 ActiveRecord 模型:

data_1
data_2
data_3

我如何编写一个验证来检查这些字段中的至少一个是否不是 blank?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation activerecord model


    【解决方案1】:

    这可以通过像这样的自定义验证器来完成,

    在你的模型中写,

     validates :validate_attrlist
    
     def validate_attrlist
        unless !data_1.blank? or !data_2.blank? or !data_3.blank?
           record.errors[:base] << "Can't be blank"
        end
      end
    

    【讨论】:

    • 谢谢。但这实际上是不正确的。我要求进行验证以检查:“这些字段中至少有一个不是空白的?”但这会验证 any 字段是否为空白。它应该是'如果 data_1.blank?和data_2.blank?和data_3.blank?不应该吗?
    • 你的意思是,没有一个字段需要为空白?如果没有一个字段是空白的,它将引发错误。这不是你的要求吗?
    【解决方案2】:

    好的。这是我的做法

    validate :has_content
    
    
    def has_content
      if data_1.blank? && data_2.blank? && data_3.blank?
        errors[:base] = "Must have a filename or a URL"
      end
    end
    

    【讨论】:

      【解决方案3】:

      您可以使用属性列表和集合#any? #全部?方法:

      [attr1, attr2, ..., attrN].all? {|a| a.nil? || a == "" }

      [attr1, attr2, ..., attrN].map(&amp;:to_s).any? {|a| !a.empty? }

      这是普通的 Ruby,ActiveSupport 更简单,你有#present 吗?或#blank?,例如:

      [attr1, attr2, ..., attrN].any?(&amp;:present?)

      最后,对于两个值,您可以使用 XOR 运算:value1 ^ value2

      【讨论】:

        猜你喜欢
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 2017-09-02
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多