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

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

Вопрос

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

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

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

Это было полезно?

Решение

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

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

Зовущий book.close установит состояние на closed, но не будет автоматически сохранен.Зовущий book.close! установит состояние * и* автоматически сохранит AR-объект.

Другие советы

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

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

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

Однако в коде вместо этого фактически вызывается save!

unless self.save

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

unless self.save(false)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top