Сохранение столбца состояния при переходе с использованием rubyist-aasm (действует как конечный автомат)
-
22-08-2019 - |
Вопрос
Каков наилучший способ сохранить состояние объекта в базе данных при переходе с использованием 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) по своей конструкции не сохраняет записи автоматически.
Вы можете сделать экономию в обратный вызов если ты хочешь (а похоже, что хочешь).