2009-03-25 5 views
7

Quelle est la meilleure façon de conserver l'état de l'objet à la base de données lors d'une transition utilisant aasm? J'avais pensé que cela arriverait automatiquement mais cela ne semble pas être le cas.Persistance de la colonne d'état lors de la transition à l'aide de rubyist-aasm (agit en tant que machine d'état)

(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 implémentation de machine à états finis alternative avec une meilleure documentation, qui pourrait aussi aider.

Répondre

14

Si vous appelez le 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 

Appel book.close définira l'état à closed, mais ne sauvera pas automatiquement. L'appel book.close! définira l'état * et * enregistre automatiquement l'objet AR.

-3

Je pense que vous devez enregistrer dans la transition si c'est l'effet que vous voulez. ActiveRecord (sur lequel asasm est assis) ne sauvegarde pas automatiquement les enregistrements, par définition.

Vous pouvez faire la sauvegarde dans un callback si vous voulez (et il semble que vous le fassiez).

+0

Merci, c'est ce dont j'avais besoin. Il semble que certains jours je ne peux pas penser à des mots de fantaisie comme 'callback';) – Angela

+2

Ceci est inutile. Toutes les transitions d'événement ont une méthode bang qui va automatiquement conserver l'enregistrement. Voir ma réponse pour plus d'informations. –

0

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

4

Comme le suggère Colin, AASM persistera vos changements pour vous. Ce que Markus a dit est tout à fait incorrect, sauf 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 stipule:

Ecrit état à la colonne d'état et persiste à la base de données à l'aide update_attribute (qui court-circuite la validation)

Cependant, dans le code, il appelle effectivement sauver la place! Le bug survient lorsque le modèle sous-jacent échoue à la validation, car la méthode de sauvegarde ne contourne pas la validation par défaut. Une solution rapide serait de le faire à la place:

unless self.save(false) 

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

Questions connexes