posso vedere un paio di modi diversi. I penso il migliore sarebbe aggiungere un altro campo alla tabella chiamato qualcosa come lifecycle_id_original
. Allora il vostro modello sarebbe includere il codice come questo:
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
Quando l'oggetto (elemento in questo esempio) viene convalidato, sarà richiesto solo lifecycle_change_reason quando l'originale e lifecycle_id non sono identici. Un valore nullo è anche consentito per l'originale, perché è quello che sarà quando un record è stato appena creato.
Quindi, quando viene salvato, "originale" viene impostato in modo che corrisponda a lifecycle_id, quindi il prossimo ciclo di aggiornamento funzionerà correttamente.
Questo non è pulito come mi piacerebbe. Il mio primo pensiero è stato quello di utilizzare un attr_accessor
in modo che il duplicato non venga sempre memorizzato nel DB, ma ciò significherebbe impostare tale valore ogni volta che viene caricato un record. Non sono a conoscenza di alcun callback in stile on_load per i modelli ActiveRecord.
fonte
2010-01-18 16:07:52
il problema con questo è che non si ottiene tutto il bel errore di convalida di gestione in il modulo. –
Sicuramente lo sai fare anche tu: @ object.errors.add (: life_cycle_change_reason, "deve essere fornito.") Semplice. – adriandz