代码之家  ›  专栏  ›  技术社区  ›  Ryan

Rails大于模型属性的模型验证

  •  18
  • Ryan  · 技术社区  · 16 年前

    我有一个旅行模型,其中有一个开始里程表和结束里程表的值。 在我的模型中,我想验证结束里程表比开始里程表大。 终点里程表也可以是空白的,因为行程可能还没有结束。

    但是,我不知道如何比较一个属性和另一个属性。

    在Tr.RB:

    与符号比较:

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

    给我一个错误:

    tripscontroller索引中的参数错误

    :大于必须是数字

    与变量比较:

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

    tripscontroller索引中的名称错误

    未定义的局部变量或方法“start-odometer”#

    4 回复  |  直到 12 年前
        1
  •  18
  •   jmcnevin    16 年前

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

    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
  •  32
  •   holden    15 年前

    对于这种情况,不一定需要自定义验证方法。事实上,如果你只用一条线就能做到,那就有点过分了。JN80842的建议很接近,但您必须将其包装在proc或lambda中才能工作。

    validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true
    
        3
  •  6
  •   Blair Anderson    12 年前

    如果使用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
  •  -4
  •   jn80842    16 年前

    这有点笨拙,但这似乎管用:

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