2009-03-25 5 views
7

¿Cuál es la mejor manera de mantener el estado del objeto en la base de datos en una transición usando aasm? Pensé que esto sucedería automáticamente, pero este no parece ser el caso.Persistencia de la columna de estado en la transición usando rubyist-aasm (actúa como máquina de estados)

(Edit: al guardar manualmente el objeto, la columna de estado se vuelve a actualizar Pero una salvación no se realiza en las transiciones..)

No puedo encontrar documentación mucho más útil para este plugin, por lo que si tiene una sugerencia para una implementación de máquina de estados finita alternativa con mejor documentación, que también podría ayudar.

Respuesta

14

¡Si llama al bang! forma del método de evento de transición, el estado persistirá. Por ejemplo, supongamos que tiene un objeto con el suceso siguiente:

class Book < ActiveRecord::Base 
    # ... 

    aasm_event :close do 
    transitions :to => :closed, :from => [:opened] 
    end 

    # ... 
end 

Calling book.close va a establecer el estado de closed, pero no se guarda automáticamente. Llamar al book.close! configurará el estado * y * guardará automáticamente el objeto AR.

-3

Creo que tiene que guardar en la transición si ese es el efecto que desea. ActiveRecord (que aasm está encima) no guarda automáticamente los registros, por diseño.

Puede hacer el guardado en un callback si lo desea (y parece que lo hace).

+0

Gracias, eso es lo que necesitaba. Parece que algunos días no puedo pensar en palabras elegantes como 'callback';) – Angela

+2

Esto no es necesario. Todas las transiciones de eventos tienen un método bang que automáticamente persistirá en el registro. Ver mi respuesta para más información. –

0

Creo que AASM persistirá en el estado del objeto después de la transición. Consulte las líneas 180-189 en aasm/lib/persistence/active_record_persistence.rb

4

Como sugiere Colin, AASM conservará los cambios por usted. Lo que Markus ha dicho es completamente incorrecto, excepto por el hecho de que la última versión de la gema tiene un error.

En la línea 180 de lib/persistencia/active_record_persistence.rb (se puede obtener mediante la ejecución de esta joya: desempaquetar), debería ver el comentario, que establece:

Escribe estado a la columna de estado y persiste a la base de datos utilizando update_attribute (que no pasa la validación)

Sin embargo, en el código, lo que realmente llama a guardar en su lugar!

unless self.save 

El error se produce cuando el modelo subyacente no valida, porque el método de guardar no omite la validación por defecto. Una solución rápida sería hacer esto en su lugar:

unless self.save(false) 

Ahora, las transiciones de hecho guardar el nuevo estado a la base de datos.

Cuestiones relacionadas