puedo ver un par de maneras diferentes. I piensa que lo mejor sería agregar otro campo a la tabla llamado algo así como lifecycle_id_original
. Luego, su modelo incluiría código como este:
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
Cuando se valida el objeto (miembro en este ejemplo), sólo se requiere lifecycle_change_reason cuando el original y lifecycle_id no son idénticos. También se permite un valor nulo para el original, porque eso es lo que será cuando se cree un nuevo registro.
Luego, cuando se guarda, el "original" se establece para que coincida con el ciclo de vida_id, por lo que el siguiente ciclo de actualización funcionará correctamente.
Esto no es tan limpio como me gustaría. Lo primero que pensé fue utilizar un attr_accessor
para que el duplicado no se almacenara en el DB todo el tiempo, pero eso hubiera significado establecer ese valor cada vez que se carga un registro. No estoy al tanto de ninguna devolución de llamada de estilo on_load para los modelos ActiveRecord.
el problema con esto es que no obtienen el manejo de todo el error de validación en buen la forma. –
Seguramente usted sabe cómo hacerlo también: @ object.errors.add (: life_cycle_change_reason, "debe proporcionarse") Simple. – adriandz