Rails:如何要求至少一个字段不为空

deb*_*deb 28 validation ruby-on-rails models

我知道我可以通过添加validates_presence_of :field到模型来要求字段.但是,如何要求至少一个字段是强制性的,而不需要任何特定字段?

提前致谢

- Deb

Voy*_*yta 30

您可以使用:

validate :any_present?

def any_present?
  if %w(field1 field2 field3).all?{|attr| self[attr].blank?}
    errors.add :base, "Error message"
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑:根据评论更新Rails 3+的原始答案.

但您必须手动提供字段名称.您可以获取模型的所有内容列Model.content_columns.map(&:name),但它也将包括列created_atupdated_at列,这可能不是您想要的.

  • 要更新Rails 3的答案,请使用`errors.add:base,"错误消息"`作为add_to_base不推荐使用 (8认同)

Sha*_*man 9

这是一个可重用的版本:

class AnyPresenceValidator < ActiveModel::Validator
  def validate(record)
    unless options[:fields].any?{|attr| record[attr].present?}
      record.errors.add(:base, :blank)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在模型中使用它:

validates_with AnyPresenceValidator, fields: %w(field1 field2 field3)
Run Code Online (Sandbox Code Playgroud)


Rob*_*her 8

validate在模型中添加方法:

def validate
  if field1.blank? and field2.blank? and field3.blank? # ...
    errors.add_to_base("You must fill in at least one field")
  end
end
Run Code Online (Sandbox Code Playgroud)