:inclusion => {:in => r = (1..15), :min => r.first, :max => r.last}
这是我的工作代码。我想让"15"变成动态的部分,例如
我定义了下面的类方法::包含=> {:=> r = (1 . . Vehicle.max_passengers): min => r.first,: max => r.last}
def self.max_passengers
15
end
当然没用。我试过使用Procs和lambdas,但它不适合我。:(有人能帮我解决这个问题吗?
您正在寻找自定义验证方法:
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 } }
注意,如果您在range上使用:in
,则不需要min/max。
检查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
试试这个:
inclusion: { in: proc { 1..Vehicle.max_passengers } }