#ruby-on-rails #state-machine #aasm
#ruby-on-rails #конечный автомат #aasm
Вопрос:
У меня есть модель rails Creative
, которая реализует рабочий процесс с использованием aasm
gem. В настоящее время в моей модели реализован только один рабочий процесс.
У меня есть бизнес-сценарий, который потребует от меня реализации другого рабочего процесса в той же модели, который будет активирован, если логическое значение в модели равно true
.
Я вижу 2 подхода, которые могут быть жизнеспособными вариантами
- Создайте новую модель, которая использует то же имя таблицы
Creative
, что и и реализует рабочий процесс там - Реализовать рабочий процесс в той же модели, используя отдельный столбец для хранения состояний для второго рабочего процесса и использовать его метод в зависимости от моего логического значения
Какой был бы хороший дизайн, который можно было бы реализовать здесь?
Я понимаю, что это очень открытый вопрос, и хотел бы получить предложения, если кто-нибудь сталкивался с таким сценарием
Ответ №1:
Я думаю, что что-то подобное должно сработать.
event :promote do
transitions :from => [:pending], :to => :in_progress, :guard => :boolean_check?
transitions :from => [:pending], :to => :done
end
event :complete do
transitions :from => [:in_progress], :to => :done, :guard => :boolean_check?
end
private
def boolean_check?
self.boolean_column
end
Если логическое значение равно true, поток будет
pending > in_progress > done
ещё
pending > done
ПРИМЕЧАНИЕ: это может усложниться, если, скажем, у вас есть 3-4 рабочих процесса.
Все в порядке, пока у вас не будет 2 рабочих процесса
Комментарии:
1. Спасибо за это. Это то, что я мог бы попробовать. К сожалению, предоставленное решение работает в случае небольшого количества событий. Требуемый нам рабочий процесс содержит довольно много разных событий, и для каждого события необходимо будет добавить защиту, а новые события должны быть добавлены в тот же рабочий процесс, что сделает его нечитаемым фрагментом кода. Еще раз спасибо. Я попробую это