2010-01-18 17 views
5

Tengo una tabla con una columna llamada lifecycle_id, y otra llamada lifecycle_change_reason. lifeycle_id normalmente se cambia automáticamente por el sistema en función de otros factores, pero ciertos usuarios tienen la capacidad de cambiar el ciclo de vida de forma manual. si lo hacen, me gustaría pedirles que proporcionen una razón para el cambio, pero no quiero requerir ese campo en ningún otro momento. ¿Alguien tiene alguna sugerencia sobre cómo puedo realizar este tipo de validación?¿cómo validar la presencia de un campo solo si otro campo fue editado en rieles?

THX :)

-C

Respuesta

0

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.

-1

Esto parece ser para lo que es el controlador. Me doy cuenta de que la gente quiere aplicar lógica a los modelos, y por una buena razón, pero seamos pragmáticos aquí: si su sistema está cambiando este valor automáticamente, y solo hay un punto en su sistema donde alguien puede cambiarlo manualmente, lo hace no, en mi opinión, todo lo que introducir una complejidad mucho simplemente hacer cumplir la existencia de un motivo en su controlador con algo tan simple como:

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank? 
    flash[:error] = "You must enter a reason for changing the life cycle." 
    redirect_to :back and return false # or whatever 
end 
+0

el problema con esto es que no obtienen el manejo de todo el error de validación en buen la forma. –

+0

Seguramente usted sabe cómo hacerlo también: @ object.errors.add (: life_cycle_change_reason, "debe proporcionarse") Simple. – adriandz

Cuestiones relacionadas