【问题标题】:Rails greater_than model validation against model attribute针对模型属性的 Rails 大于模型验证
【发布时间】:2010-12-31 07:04:09
【问题描述】:

我有一个 Trip 模型,其中包括一个 start_odometer 和 end_odometer 值。 在我的模型中,我想验证末端里程表是否大于起始里程表。 终点里程表也可能是空白的,因为行程可能还没有结束。

但是,我不知道如何将一个属性与另一个属性进行比较。

在trip.rb中:

与符号比较:

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

给我错误:

TripsController#index 中的参数错误

:greater_than 必须是数字

对比变量:

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

TripsController#index 中的名称错误

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

【问题讨论】:

标签: ruby-on-rails validation


【解决方案1】:

这有点笨拙,但这似乎有效:

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

【讨论】:

  • 绝对行不通,这会将符号:start_odometer 转换为整数并将其传递给:greater_than不要使用这段代码,完全错误
【解决方案2】:

您可能需要为此在模型中编写自定义验证方法...

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 一直在寻找同样的东西,这种方法对我很有效。
    • 也不需要Proc,只需:start_odometer 即可。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多