La persistance de la colonne de l'état de transition à l'aide rubyist-AASM (agit en tant que machine d'état)

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

Question

Quelle est la meilleure façon de persister l'état de l'objet à la base de données sur une transition à l'aide aasm? Je pensais que cela arriverait automatiquement, mais cela ne semble pas être le cas.

(Edit:.. Quand j'enregistrer manuellement l'objet, la colonne d'état ne soit mis à jour mais une sauvegarde ne se fait pas sur les transitions)

Je ne trouve pas beaucoup de documentation utile pour ce plug-in, donc si vous avez une suggestion pour une mise en œuvre de la machine à états finis alternatif avec une meilleure documentation, qui pourrait aider aussi bien.

Était-ce utile?

La solution

Si vous appelez bang! forme de la méthode d'événement de transition, l'état persistera. Par exemple, supposons que vous avez un objet avec l'événement suivant:

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

L'appel book.close va définir l'état à closed, mais ne sauvera pas automatiquement. book.close! L'appel sera mis en l'état * et * enregistrer automatiquement l'objet AR.

Autres conseils

Colin suggère, AASM persistera vos modifications pour vous. Ce que Markus a dit est à plat incorrect, à l'exception du fait que la dernière version de la gemme a un bug.

Sur la ligne 180 de lib / persistance / active_record_persistence.rb (vous pouvez obtenir en pierre précieuse en cours d'exécution: déballer), vous devriez voir le commentaire qui dit:

  

Rédige état à la colonne d'état et il persiste à la base de données   en utilisant update_attribute (qui contourne validation)

Cependant, dans le code, il appelle réellement sauver la place!

unless self.save

Le bogue se produit lorsque le modèle sous-jacent validation échoue, car la méthode d'enregistrement ne fonctionne pas la validation de contournement par défaut. Une solution rapide serait de faire ceci:

unless self.save(false)

Maintenant, les transitions ne fait enregistrer à la base de données du nouvel état.

Je crois que AASM persistera l'état de l'objet après la transition. Voir les lignes 180-189 dans aasm / lib / persistance / active_record_persistence.rb

Je pense que vous devez enregistrer dans la transition si c'est l'effet que vous voulez. ActiveRecord (qui AASM est assis sur le dessus de) ne pas autosave enregistrements, par la conception.

Vous pouvez faire l'économie d'une rappel si vous voulez (et il semble que vous faites).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top