2009-12-31 12 views
18

Ich habe ein Trip-Modell, das neben anderen Attributen einen Start_odometer- und end_odometer-Wert hat. In meinem Modell möchte ich bestätigen, dass der Endkilometerzähler größer als der Startkilometerzähler ist. Der Endkilometerzähler kann auch leer sein, da die Auslösung möglicherweise noch nicht beendet ist.Schienen größer_als Modellvalidierung gegen Modellattribut

Allerdings kann ich nicht herausfinden, wie man ein Attribut mit einem anderen vergleicht.

In trip.rb:

gegen das Symbol Vergleich:

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

gibt mir den Fehler:

ArgumentError in TripsController#index

:greater_than must be a number

Vergleich gegen die 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

Ich finde, dass das etwas Nützliches in Rails wäre. Vielleicht ein Ticket für den Leuchtturm: http://rails.lighthouseapp.com dafür? –

Antwort

18

Sie werden wahrscheinlich eine benutzerdefinierte Validierungsmethode in Ihrem Modell für diese ...

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

Danke, funktioniert super! – Ryan

-4

Es ist ein bisschen kludgy, aber dies scheint zu funktionieren:

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

Sie benötigen ein Proc oder Lambda, damit dieses Beispiel funktioniert. – holden

+3

Funktioniert definitiv nicht, dies verwandelt das Symbol ': start_odometer' in eine ganze Zahl und übergibt diese an': greater_than'. ** Benutze diesen Code nicht, es ist völlig falsch **. – meagar

32

Sie don‘schreiben müssen Für diesen Fall benötigen Sie unbedingt eine benutzerdefinierte Validierungsmethode. In der Tat ist es ein bisschen übertrieben, wenn Sie es mit einer Linie tun können. Der Vorschlag von jn80842 ist nahe, aber Sie müssen ihn in einen Proc oder Lambda einfügen, damit er funktioniert.

+0

War auf der Suche nach dem gleichen Ding und dieser Ansatz funktioniert gut für mich. – Sg1team

+4

Kein Bedarf für einen 'Proc', nur': Start_odometer' funktioniert. –

6

Sie können mit einem Modellattribut überprüfen, wenn Sie einen Proc.

In rails4 würden Sie so etwas tun:

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 
Verwandte Themen