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.
das Problem mit dieser ist, erhalten Sie nicht alle die nette Validierung Fehlerbehandlung in die Form. –
Sicherlich können Sie das auch tun: @ object.errors.add (: life_cycle_change_reason, "muss zur Verfügung gestellt werden.") Einfach. – adriandz