Сохранение столбца состояния при переходе с использованием rubyist-aasm (действует как конечный автомат) - PullRequest
7 голосов
/ 25 марта 2009

Каков наилучший способ сохранить состояние объекта в базе данных при переходе с использованием aasm? Я думал, что это произойдет автоматически, но, похоже, это не так.

(Правка: когда я сохраняю объект вручную, столбец состояния обновляется. Но при переходах сохранение не выполняется.)

Я не могу найти много полезной документации для этого плагина, поэтому, если у вас есть предложение альтернативной реализации конечного автомата с лучшей документацией, это также может помочь.

Ответы [ 4 ]

14 голосов
/ 10 августа 2009

Если вы вызываете форму bang! метода события перехода, состояние сохраняется. Например, скажем, у вас есть объект со следующим событием:

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

Вызов book.close установит состояние на closed, но не сохранит автоматически. Вызов book.close! установит состояние * и * автоматически сохранит объект AR.

4 голосов
/ 13 апреля 2009

Как предполагает Колин, AASM сохранит ваши изменения за вас. То, что сказал Маркус, совершенно неверно, за исключением того факта, что в последней версии камня есть ошибка.

В строке 180 файла lib / persistence / active_record_persistence.rb (вы можете получить это, запустив gem: unpack), вы должны увидеть комментарий, в котором говорится:

Записывает состояние в столбец состояния и сохраняет его в базе данных. используя update_attribute (который обходит валидацию)

Однако, в коде, вместо этого он вызывает save!

unless self.save

Ошибка возникает, когда базовая модель не проходит проверку, потому что метод сохранения не обходит проверку по умолчанию. Быстрое решение было бы сделать это вместо этого:

unless self.save(false)

Теперь переходы действительно сохраняют новое состояние в базе данных.

0 голосов
/ 25 марта 2009

Я полагаю, что AASM сохранит состояние объекта после перехода. Смотрите строки 180-189 в aasm / lib / persistence / active_record_persistence.rb

0 голосов
/ 25 марта 2009

Я думаю, что вы должны сохранить в переходе, если это эффект, который вы хотите. ActiveRecord (на котором находится aasm) не поддерживает автоматическое сохранение записей.

Вы можете сделать сохранение в обратном вызове , если хотите (и звучит так, как вы).

...