组合验证不能为空

大家都知道validates_presence_of用来验证是否为空,那么,对几个属性进行组合验证是否为空,该怎么写呢?

 

下面举个简单的例子。

 

module ActiveRecord
  module Validations
    module ClassMethods
      def validates(*attr_names)
        msg = attr_names.collect {|a| a.is_a?(Array) ? " ( #{a.join(", ")} ) " : a.to_s}.join(", ") +
                    " can't all be blank.  At least one field  must be filled in."
        configuration = {
          :on => :save,
          :message => msg }
        configuration.update(attr_names.extract_options!)

        send(validation_method(configuration[:on]), configuration) do |record|
          found = false
          attr_names.each do |a|
            a = [a] unless a.is_a?(Array)
            found = true
            a.each do |attr|
              value = record.respond_to?(attr.to_s) ? record.send(attr.to_s) : record[attr.to_s]
              found = !value.blank?
            end
            break if found
          end
          record.errors.add_to_base(configuration[:message]) unless found
        end
      end
    end
  end
end

 

我们可以像这样去使用它:

 

validates :nickname, :passport, :password

 

这个用来验证nickname、passport和password是否均为空,三者只要有一个不为空,则验证通过。

 

我们还可以这样来用它:

 

validates :nickname, [:passport, :password]

 

这个用来验证nickname或者(passport和password)是否均为空,二者只要有一个不为空(后者必须均不为空),则验证通过。

 

具体如何将这个方法加入模块中,可以参考http://www.iteye.com/topic/521123

你可能感兴趣的:(ActiveRecord)