Persistindo a coluna em estado de transição usando Rubyist-AASM (actua como máquina de estado)

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

Pergunta

Qual é a melhor maneira de manter o estado do objeto para o banco de dados em uma transição usando AASM? Eu tinha pensado que isso iria acontecer automaticamente, mas isso não parece ser o caso.

(Edit:.. Quando eu manualmente salvar o objeto, a coluna estado é atualizado Mas uma gravação não é feito em transições)

Não consigo encontrar muita documentação útil para este plugin, por isso, se você tem uma sugestão para uma implementação de máquina de estado alternativa finito com uma melhor documentação, que a ajuda poderia muito bem.

Foi útil?

Solução

Se você chamar o Bang! forma do método evento de transição, o Estado vai persistir. Por exemplo, digamos que você tem um objeto com o seguinte evento:

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

Chamando book.close irá definir o estado para closed, mas não vai salvar automaticamente. Chamando book.close! irá definir o estado * e * automaticamente salvar o objeto AR.

Outras dicas

Como Colin sugere, AASM irá persistir as alterações para você. O que Markus disse é flat out incorreto, exceto pelo fato de que a versão mais recente da gema tem um bug.

Na linha 180 de lib / persistência / active_record_persistence.rb (você pode obter isso executando gem: descompactar), você deve ver o comentário, que afirma:

Grava estado para a coluna de estado e persiste-lo para o banco de dados usando update_attribute (que ignora validação)

No entanto, no código, ele realmente chama save em vez!

unless self.save

O bug ocorre quando o modelo subjacente falhar na validação, porque o método Save não desvio de validação por padrão. Uma solução rápida seria fazer isso em vez disso:

unless self.save(false)

Agora, as transições, de fato, salvar o novo estado para o banco de dados.

Eu acredito AASM irá persistir o estado do objeto após a transição. Veja as linhas 180-189 na AASM / lib / persistência / active_record_persistence.rb

Eu acho que você tem que salvar na transição se esse é o efeito que você deseja. ActiveRecord (que AASM está sentado em cima de) não registros de salvamento automático, por design.

Você pode fazer a economia em uma callback se você quiser (e parece que você faz).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top