Rails模型验证:针对模型属性的greater_than验证

19
我有一个Trip模型,其中包括起始里程和结束里程等属性。 在我的模型中,我希望验证结束里程大于起始里程。 由于旅行可能还没有结束,因此结束里程也可以为空。
但是,我无法想出如何将一个属性与另一个属性进行比较。
在trip.rb文件中:
使用符号进行比较:
validates_numericality_of :end_odometer, :greater_than => :start_odometer, :allow_blank => true

我遇到了以下错误:

TripsController#index中的ArgumentError

:greater_than必须是一个数字

与该变量进行比较:

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

TripsController#index中的NameError

未定义的本地变量或方法`start_odometer'


1
我觉得这在Rails中会很有用。也许可以提交一个工单到Lighthouse:http://rails.lighthouseapp.com? - Ryan Bigg
4个回答

35

对于这种情况,您不一定需要自定义验证方法。实际上,当你可以用一行代码解决问题时,这有点过度设计了。jn80842的建议接近,但您必须将其包装在Proc或Lambda中才能使其工作。

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

我也在寻找同样的东西,这种方法对我非常有效。 - Sg1team
5
不需要Proc,只需使用:start_odometer即可。 - Marc-André Lafortune

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

9

如果您使用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

-4

有点笨拙,但似乎可以工作:

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

3
这段代码绝对行不通,它将符号:start_odometer转换为整数并传递给:greater_than不要使用这段代码,它完全错误 - user229044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接