Ruby on rails 如何在RubyonRails中检查属性是否具有存在性验证

Ruby on rails 如何在RubyonRails中检查属性是否具有存在性验证,ruby-on-rails,validation,ruby-on-rails-4,attributes,Ruby On Rails,Validation,Ruby On Rails 4,Attributes,有没有办法知道属性是否有验证?大致如下: Model.attribute.has_presence_validation? 我不确定最简单的解决方案是什么,但我以相当复杂的方式实现了这个功能。也许有人能想出更简单的解决办法。这是对我来说非常有效的代码 我获取模型上的所有验证,选择状态验证(ActiveRecord::validations::PresenceValidator),然后选择它们的所有属性,并使用include检查属性(:your_属性)在此数组中的存在性 Model.valida

有没有办法知道属性是否有验证?大致如下:

Model.attribute.has_presence_validation?

我不确定最简单的解决方案是什么,但我以相当复杂的方式实现了这个功能。也许有人能想出更简单的解决办法。这是对我来说非常有效的代码

我获取模型上的所有验证,选择状态验证(ActiveRecord::validations::PresenceValidator),然后选择它们的所有属性,并使用include检查属性(:your_属性)在此数组中的存在性

Model.validators.collect{|validation| validation if validation.class==ActiveRecord::Validations::PresenceValidator}.compact.collect(&:attributes).flatten.include? :your_attribute
您可以更改比较语句

validation.class==ActiveRecord::Validations::PresenceValidator

为了让我获得所有其他类型的验证,例如唯一性等,下面的代码正在工作(它基本上是检查给定字段的任何验证程序是否是状态验证程序的实例):


结合其他答案中的一些要点,我认为以下方法最简单(Rails 4.2.7):

编辑:

我认为更全面的解决方案是使用助手或控制器方法:

def validated_attrs_for(model, validation)
    if validation.is_a?(String) || validation.is_a?(Symbol)
      klass = 'ActiveRecord::Validations::' \
              "#{validation.to_s.camelize}Validator"
      validation = klass.constantize
    end
    model.validators
         .select { |v| v.is_a?(validation) }
         .map(&:attributes)
         .flatten
end
使用:


只需再次检查各种验证器(:presence,:university,等等)是否正确地对应于相应的验证器类——我很确定它们是正确的,但最近没有查看过。

有趣的问题(+1)。使用这个的上下文是什么?谢谢,在我的例子中,将把“include_blank”放在一个动态生成的select中
class Model < ActiveRecord::Base
  validates ... # Whatever your validation are

  def self.presence_required_attrs
    validators.select do |v|
      v.is_a?(ActiveRecord::Validations::PresenceValidator)
    end.map(&:attributes).flatten
  end
end
Model.presence_required_attrs.include?(:my_attribute)
def validated_attrs_for(model, validation)
    if validation.is_a?(String) || validation.is_a?(Symbol)
      klass = 'ActiveRecord::Validations::' \
              "#{validation.to_s.camelize}Validator"
      validation = klass.constantize
    end
    model.validators
         .select { |v| v.is_a?(validation) }
         .map(&:attributes)
         .flatten
end
validated_attrs_for(Model, :presence).include?(:my_attribute)