ruby-on-rails - software - ruby on rails tutorial
¿Cómo detectar cambios de atributos desde el modelo? (5)
Deberías mirar el módulo ActiveModel::Dirty : deberías poder realizar las siguientes acciones en tu modelo de Reclamo:
claim.status_changed? # returns true if ''status'' attribute has changed
claim.status_was # returns the previous value of ''status'' attribute
claim.status_change # => [''old value'', ''new value''] returns the old and
# new value for ''status'' attribute
claim.name = ''Bob''
claim.changed # => ["name"]
claim.changes # => {"name" => ["Bill", "Bob"]}
Oh! las alegrías de Rails!
Me gustaría crear una función de devolución de llamada en los rieles que se ejecuta después de que se guarda un modelo.
Tengo este modelo, reclamo que tiene un atributo ''estado'' que cambia según el estado del reclamo, los posibles valores están pendientes, respaldados, aprobados, rechazados
La base de datos tiene ''estado'' con el valor predeterminado de ''pendiente''.
Me gustaría realizar ciertas tareas después de que el modelo se crea la primera vez o se actualiza de un estado a otro, dependiendo de qué estado cambie.
Mi idea es tener una función en el modelo:
after_save :check_state
def check_state
# if status changed from nil to pending (created)
do this
# if status changed from pending to approved
performthistask
end
Mi pregunta es ¿cómo puedo verificar el valor anterior antes del cambio dentro del modelo?
He visto la pregunta aumentar en muchos lugares, así que escribí un rubí minúsculo para ello, para hacer el código un poco más agradable (y evitar un millón de declaraciones if / else en todas partes): https://github.com/ronna-s/on_change . Espero que eso ayude.
Será mucho mejor utilizar una solución bien probada, como la gema state_machine .
Te recomiendo que eches un vistazo a uno de los complementos de máquina de estado disponibles:
Cualquiera de los dos te permitirá configurar estados y transiciones entre estados. Manera muy útil y fácil de manejar sus requerimientos.
puedes usar esto
self.changed
devuelve una matriz de todas las columnas que cambiaron en este registro
también puedes usar
self.changes
que devuelve un hash de columnas que cambiaron y resultados antes y después como matrices