Persistierende den Spalt Zustand beim Übergang unter Verwendung rubyist-AASM (dient als Zustandsmaschine)

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

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.

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top