2009-12-31 9 views
18

Tengo un modelo Trip, que entre otros atributos tiene un valor start_odometer y end_odometer. En mi modelo, me gustaría validar que el cuentakilómetros final es más grande que el cuentakilómetros inicial. El cuentakilómetros final también puede estar en blanco porque es posible que el viaje no haya finalizado todavía.Rails mayor_que la validación del modelo contra el atributo de modelo

Sin embargo, no puedo entender cómo comparar un atributo con otro.

En trip.rb:

comparando contra el símbolo:

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

me da el error:

ArgumentError in TripsController#index

:greater_than must be a number

comparar con la variable:

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

NameError in TripsController#index

undefined local variable or method `start_odometer' for #

+1

me siento esto sería algo útil en los carriles. Tal vez envíe un ticket al Faro: http://rails.lighthouseapp.com para ello? –

Respuesta

18

es probable que necesite para escribir un método de validación de encargo en su modelo de esta ...

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 
+0

¡Gracias, funciona genial! – Ryan

-4

Es un poco kludgy, pero esto parece que funciona:

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

Necesitará un proc o lambda para que funcione este ejemplo. – holden

+3

Definitivamente no funciona, esto convierte el símbolo ': start_odometer' en un entero y lo pasa a': greater_than'. ** No use este código, está completamente mal **. – meagar

32

Usted don' Necesitamos necesariamente un método de validación personalizado para este caso. De hecho, es un poco exagerado cuando puedes hacerlo con una línea. La sugerencia de jn80842 está cerca, pero debes envolverla en un Proc o Lambda para que funcione.

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

Estaba buscando lo mismo y este enfoque funciona muy bien para mí. – Sg1team

+4

No hay necesidad de un 'Proc' tampoco, solo': start_odometer' funcionará. –

6

Puede validar contra un atributo de modelo si utiliza un Proc.

En rails4 que haría algo como esto:

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 
Cuestiones relacionadas