Реализовать условный конечный автомат для модели rails

#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. Спасибо за это. Это то, что я мог бы попробовать. К сожалению, предоставленное решение работает в случае небольшого количества событий. Требуемый нам рабочий процесс содержит довольно много разных событий, и для каждого события необходимо будет добавить защиту, а новые события должны быть добавлены в тот же рабочий процесс, что сделает его нечитаемым фрагментом кода. Еще раз спасибо. Я попробую это