我有一个Trip模型,其中包含start_odometer和end_odometer值。 在我的模型中,我想验证结束里程表是否比起始里程表大。 结束里程表也可以是空白的,因为行程可能尚未完成。
但是,我无法弄清楚如何将一个属性与另一个属性进行比较。
在trip.rb中:
与符号比较:
validates_numericality_of :end_odometer, :greater_than => :start_odometer, :allow_blank => true
给我错误:
TripsController中的ArgumentError #index
:greater_than必须是数字
与变量进行比较:
validates_numericality_of :end_odometer, :greater_than => start_odometer, :allow_blank => true
TripsController中的NameError #index
未定义的局部变量或方法`start_odometer'用于#
答案 0 :(得分:34)
对于这种情况,您不一定需要自定义验证方法。事实上,当你可以用一条线做它有点矫枉过正。 jn80842的建议很接近,但你必须把它包装在Proc或Lambda中才能使它工作。
validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true
答案 1 :(得分:18)
您可能需要在模型中为此编写自定义验证方法......
validate :odometer_value_order
def odometer_value_order
if self.end_odometer && (self.start_odometer > self.end_odometer)
self.errors.add_to_base("End odometer value must be greater than start odometer value.")
end
end
答案 2 :(得分:7)
如果使用Proc。
,则可以针对模型属性进行验证在rails4中你会做这样的事情:
class Trip < ActiveRecord::Base
validates_numericality_of :start_odometer, less_than: ->(trip) { trip.end_odometer }
validates_numericality_of :end_odometer, greater_than: ->(trip) { trip.start_odometer }
end
答案 3 :(得分:-4)
这有点笨拙,但这似乎有效:
validates_numericality_of :end_odometer, :greater_than => :start_odometer.to_i, :allow_blank => true