Rails更大 - 根据模型属性进行模型验证

时间:2009-12-31 00:17:06

标签: ruby-on-rails validation

我有一个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'用于#

4 个答案:

答案 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