0
:inclusion => {:in => r = (1..15), :min => r.first, :max => r.last}

这是我的工作代码。我想要动态的是“15”部分,例如

:inclusion => {:in => r = (1..Vehicle.max_passengers), :min => r.first, :max => r.last}

我定义了以下类方法:

def self.max_passengers
   15
end  

当然没用。我试过使用 Procs 和 lambdas,但它对我来说不能正常工作。:( 有人可以帮我解决这个问题吗?有可能吗?

4

3 回答 3

3

您正在寻找自定义验证方法

ActiveRecord::Base.class_eval do
  def self.validates_max_passenger(attr_name, r)
    validates attr_name, :inclusion => { :in => r, :min => r.first, :max => r.last } }
  end
end

# later in your class of choice:      
validates_max_passenger :passengers, 1..5

或者,您可以使用 lambda 尝试以下操作

def self.max_passengers
   1..15
end  


validates :attrib, :inclusion => {:in => lambda { |obj| ClassName.max_passengers } }

请注意,如果您:in在范围内使用,则不需要最小值/最大值。

于 2013-01-14T11:29:08.293 回答
0

检查是否validates_with有任何帮助。这个助手将记录传递给一个单独的类进行验证,您可以在其中使您的验证标准动态化,即通过读取一些配置等。有关更多信息,validates_with请参阅 ruby​​ on rails指南

class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end

class GoodnessValidator < ActiveModel::Validator
  def validate(record)
     # implement your dynamic criteria here                 
  end
end
于 2013-01-14T11:22:44.370 回答
0

尝试这个:

inclusion: { in: proc { 1..Vehicle.max_passengers } }
于 2017-03-18T15:53:11.773 回答