2010-01-18 4 views
5

Ich habe eine Tabelle mit einer Spalte namens lifecycle_id, und eine andere namens lifecycle_change_reason. Lifeycle_id wird normalerweise automatisch vom System basierend auf anderen Faktoren geändert, aber bestimmte Benutzer haben die Möglichkeit, den Lebenszyklus manuell zu ändern. Wenn dies der Fall ist, möchte ich sie bitten, einen Grund für die Änderung anzugeben, aber ich möchte dieses Feld zu keinem anderen Zeitpunkt anfordern. Hat jemand einen Vorschlag, wie ich diese Art der Validierung durchführen kann?Wie validiere ich das Vorhandensein eines Feldes nur, wenn ein anderes Feld in Schienen bearbeitet wurde?

thx :)

-C

Antwort

0

ich verschiedene Möglichkeiten sehen ein Paar kann. I denke, die beste wäre, ein anderes Feld zu der Tabelle wie etwas wie lifecycle_id_original hinzuzufügen. Dann würde Ihr Modell Code wie folgt umfassen:

class Member < ActiveRecord::Base 
    belongs_to :lifecycle 

    validates :lifecycle_change_reason, :if => :lifecycle_changed? 

    before_save :reset_original_lifecycle 

    protected 

    def lifecycle_changed? 
    self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil? 
    end 

    def reset_original_lifecycle 
    self.lifecycle_id_original = self.lifecycle_id 
    end 
end 

Wenn das Objekt (Mitglied in diesem Beispiel) validiert ist, lifecycle_change_reason ist nur erforderlich, wenn das Original und lifecycle_id nicht identisch ist. Ein Nullwert ist auch für das Original zulässig, da dies der Fall ist, wenn ein Datensatz neu erstellt wird.

Dann, wenn es gespeichert wird, wird das "Original" auf die Lifecycle-ID abgestimmt, so dass der nächste Update-Zyklus ordnungsgemäß funktioniert.

Dies ist nicht so sauber wie ich es möchte. Mein erster Gedanke war, eine attr_accessor zu verwenden, so dass das Duplikat nicht die ganze Zeit in der Datenbank gespeichert wird, aber das hätte bedeutet, diesen Wert jedes Mal festzulegen, wenn ein Datensatz geladen wird. Mir sind keine Rückrufe im Stil von on_load für ActiveRecord-Modelle bekannt.

-1

Dies scheint wie für den Controller ist. Mir ist klar, dass Leute Logik in Modelle pushen wollen, und das aus gutem Grund, aber lasst uns hier pragmatisch sein: Wenn dein System diesen Wert automatisch ändert und es nur einen Punkt in deinem System gibt, an dem jemand ihn manuell ändern kann, tut er es nicht, meiner Meinung nach, so viel Komplexität einführen, um einfach die Existenz eines Grundes in Ihrem Controller mit etwas Einfaches wie:

+0

das Problem mit dieser ist, erhalten Sie nicht alle die nette Validierung Fehlerbehandlung in die Form. –

+0

Sicherlich können Sie das auch tun: @ object.errors.add (: life_cycle_change_reason, "muss zur Verfügung gestellt werden.") Einfach. – adriandz

Verwandte Themen