La persistencia de la columna Estado de transición utilizando Rubyist-AASM (actúa como máquina de estado)

StackOverflow https://stackoverflow.com/questions/682920

Pregunta

¿Cuál es la mejor manera de mantener el estado del objeto a la base de datos en una transición utilizando AASM? Yo había pensado que esto pasaría automáticamente, pero esto no parece ser el caso.

(Editar:.. 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, así que si usted tiene una sugerencia para una implementación máquina de estados finitos alternativa con mejor documentación, que podría ayudar también.

¿Fue útil?

Solución

Si se llama a la forma bang! 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

book.close Llamando a establecer el estado de closed, pero no se guardará automáticamente. Llamando book.close! establecerá el estado * y * guardar automáticamente el objeto de RA.

Otros consejos

Como Colin sugiere, AASM persistirán los cambios para usted. Markus lo que ha dicho es de plano incorrecta, 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   usando 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 pasa la validación, ya que el método no guardar la validación de derivación por defecto. Una solución rápida sería hacer esto en su lugar:

unless self.save(false)

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

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

Yo creo que hay que guardar en la transición si ese es el efecto que desea. ActiveRecord (que AASM se sienta encima de) no copia de seguridad automática de registros, por diseño.

Puede hacer el ahorro en un devolución de llamada si quieres (y suena igual que lo hace).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top