2009-12-31 16 views
18

Ho un modello Trip, che tra gli altri attributi ha un valore start_odometer e end_odometer. Nel mio modello, vorrei verificare che il contachilometri finale sia più grande del contachilometri iniziale. Il contachilometri finale può anche essere vuoto perché il viaggio potrebbe non essere ancora terminato.Rails greater_than validazione del modello rispetto all'attributo model

Tuttavia, non riesco a capire come confrontare un attributo con un altro.

In trip.rb:

confrontando contro il simbolo:

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

mi dà l'errore:

ArgumentError in TripsController#index

:greater_than must be a number

confrontando contro la variabile:

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

mi sento questo sarebbe qualcosa di utile in Rails. Forse presentare un biglietto per il Faro: http://rails.lighthouseapp.com per questo? –

risposta

18

avrete probabilmente bisogno di scrivere un metodo di validazione personalizzata nel modello per questa ...

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

Grazie, funziona benissimo! – Ryan

-4

è un po 'kludgy, ma questo sembra funzionare:

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

Per questo esempio è necessario un proc o lambda per funzionare. – holden

+3

La maggior parte non funziona, convertendo il simbolo ': start_odometer' in un intero e lo passa a': greater_than'. ** Non usare questo codice, è completamente sbagliato **. – meagar

32

È don' Per questo caso è necessario un metodo di convalida personalizzato. In effetti, è un po 'eccessivo quando puoi farlo con una sola riga. Il suggerimento di jn80842 è vicino, ma è necessario avvolgerlo in un Proc o Lambda perché funzioni.

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

Cercavo la stessa cosa e questo approccio funziona alla grande per me. – Sg1team

+4

Non c'è bisogno di un 'Proc', solo': start_odometer' funzionerà. –

6

È possibile convalidare un attributo di modello se si utilizza un Proc.

In rails4 si farebbe qualcosa di simile:

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 
Problemi correlati