Persistierende den Spalt Zustand beim Übergang unter Verwendung rubyist-AASM (dient als Zustandsmaschine)
-
22-08-2019 - |
Frage
Was ist der beste Weg, den Zustand des Objekts in die Datenbank auf einem Übergang mit AASM zu bestehen? Ich hatte gedacht, dass so etwas passieren würde automatisch, aber das scheint nicht der Fall zu sein.
(Edit:.. Wenn ich das Objekt manuell speichern, wird der Zustand Spalte aktualisiert wird erhalten, aber eine Speicherung nicht auf Übergänge geschehen)
Ich kann nicht viel nützliche Dokumentation für dieses Plugin finden, also, wenn Sie einen Vorschlag für eine alternative Finite State Machine Implementierung mit einem besseren Dokumentation haben, das könnte auch helfen.
Lösung
Wenn Sie die rufen bang! Form des Übergangsereignismethode, wird der Staat fortbestehen. Zum Beispiel, sagen Sie ein Objekt mit dem folgende Ereignisse haben:
class Book < ActiveRecord::Base
# ...
aasm_event :close do
transitions :to => :closed, :from => [:opened]
end
# ...
end
Beim book.close
wird der Staat auf closed
, wird aber nicht automatisch speichern. Der Aufruf book.close!
wird gesetzt, den Zustand * und * automatisch das AR-Objekt speichern.
Andere Tipps
Wie Colin schon sagt, wird AASM Ihre Änderungen für Sie bestehen. Was Markus hat gesagt, ist flach als falsch, mit Ausnahme der Tatsache, dass die neueste Version des Edelsteins hat einen Fehler.
In Zeile 180 von lib / Persistenz / active_record_persistence.rb (Sie können dies erhalten, indem Juwel laufen: auspacken), sollten Sie den Kommentar finden Sie in dem es heißt:
Schreibt Zustand in den Zustand Spalte und hält es in die Datenbank mit update_attribute (die Validierung umgeht)
Doch in dem Code, es fordert stattdessen tatsächlich sparen!
unless self.save
Der Fehler tritt auf, wenn die zugrunde liegenden Modell-Validierung fehl, weil die Methodenvalidierung Bypass speichert nicht standardmäßig aktiviert. Eine schnelle Lösung wäre, dies zu tun, statt:
unless self.save(false)
Nun, Übergänge in der Tat Sie den neuen Zustand in der Datenbank speichern.
Ich glaube AASM den Zustand des Objekts nach dem Übergang anhalten. Siehe Linien 180-189 in AASM / lib / Persistenz / active_record_persistence.rb
Ich glaube, Sie beim Übergang zu speichern, wenn das ist der Effekt, den Sie wollen. Active (die AASM ist oben sitzend) nicht Datensätze automatisch speichern, von Entwurf.
Sie können das Speichern tun in einem Rückruf wenn Sie wollen (und es klingt wie Sie tun).