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

Rya*_*yan 19 validation ruby-on-rails

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

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

在trip.rb中:

与符号比较:

validates_numericality_of :end_odometer, :greater_than => :start_odometer, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)

给我错误:

TripsController中的ArgumentError #index

:greater_than必须是一个数字

与变量比较:

validates_numericality_of :end_odometer, :greater_than => start_odometer, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)

TripsController中的NameError #index

未定义的局部变量或方法`start_odometer'for#

hol*_*den 34

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

validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)

  • 也不需要'Proc`,只需`:start_odometer`就可以了. (4认同)

jmc*_*vin 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
Run Code Online (Sandbox Code Playgroud)


Bla*_*son 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
Run Code Online (Sandbox Code Playgroud)