Rails更大 – 根据模型属性进行模型validation

我有一个Trip模型,其中包含start_odometer和end_odometer值。 在我的模型中,我想validation结束里程表是否比起始里程表大。 结束里程表也可以是空白的,因为旅行可能尚未完成。

但是,我无法弄清楚如何将一个属性与另一个属性进行比较。

在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’for#

您可能需要在模型中为此编写自定义validation方法…

 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 

对于这种情况,您不一定需要自定义validation方法。 事实上,当你用一条线做它时,有点矫枉过正。 jn80842的建议很接近,但你必须将它包装在Proc或Lambda中才能使用。

 validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true 

如果使用Proc,则可以针对模型属性进行validation。

在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 

它有点kludgy,但这似乎工作:

 validates_numericality_of :end_odometer, :greater_than => :start_odometer.to_i, :allow_blank => true