Persistente colonna Stato sulla transizione utilizzando rubyist-SAMA (agisce come macchina a stati)

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

Domanda

Qual è il modo migliore per mantenere lo stato dell'oggetto al database su una transizione utilizzando SAMA? Avevo pensato che questo sarebbe accaduto automaticamente, ma questo non sembra essere il caso.

(Edit:.. Quando salvo manualmente l'oggetto, la colonna dello stato viene aggiornato, ma un salvataggio non è fatto sulle transizioni)

Non riesco a trovare la documentazione molto utile per questo plugin, quindi se avete un suggerimento per un'implementazione macchina a stati finiti alternativo con migliore documentazione, che potrebbe aiutare pure.

È stato utile?

Soluzione

Se si chiama il bang! forma del metodo di evento di transizione, lo stato persisterà. Per esempio, supponiamo di avere un oggetto con il seguente evento:

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

book.close Calling imposterà lo stato a closed, ma non salverà automaticamente. Chiamando book.close! imposterà lo stato * e * salvare automaticamente l'oggetto AR.

Altri suggerimenti

Come suggerisce Colin, SAMA persisteranno le modifiche per voi. Ciò che Markus ha detto è flat out corretto, tranne per il fatto che l'ultima versione della gemma ha un bug.

On line 180 del lib / persistenza / active_record_persistence.rb (è possibile ottenere questo eseguendo gemma: spacchettare), si dovrebbe vedere il commento, in cui si afferma:

  

Scrive Stato alla colonna Stato e persiste al database   utilizzando update_attribute (che bypassa la validazione)

Tuttavia, nel codice, si chiama effettivamente risparmiare, invece!

unless self.save

L'errore si verifica quando il modello sottostante non supera la convalida, perché il salvataggio metodo non convalida bypass per impostazione predefinita. Una soluzione rapida sarebbe quella di fare questo, invece:

unless self.save(false)

Ora, transizioni effettivamente salvare il nuovo stato al database.

Credo SAMA persisterà lo stato dell'oggetto dopo la transizione. Vedere le linee 180-189 in ASM / lib / persistenza / active_record_persistence.rb

Credo che bisogna salvare nella transizione se questo è l'effetto che si desidera. ActiveRecord (che SAMA è seduto sulla cima di) non salva automaticamente i record, in base alla progettazione.

Si può fare il salvataggio in un richiamata se si vuole (e suona come si fa).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top