Я использовал AASM, чтобы сделать государственные машины в моем текущем проекте и задавался вопросом, что является лучшим способом автоматического вызова событий и перехода к следующему состоянию?Каков наилучший способ автоматического изменения состояния в AASM
Я рассматриваю 2 способа сделать это:
Настройка фоновое задание периодически проверять при выполнении определенных условий, следовательно, называют событие, чтобы перейти к следующему состоянию.
У вас есть
before_save
вызов метода, который пытается выполнить следующее событие подряд. С защитой от него это не удастся, если будут выполнены условия, в противном случае - изменения состояния, а в следующий раз, когда обновится модель, мы проверим новое событие.
Я склонялся к второму варианту, так как настройка очереди background_job только для событий перехода кажется излишним. Я не мог найти лучшие практики в этом отношении, поэтому мне хотелось бы узнать лучший подход и почему это так?
Пример
К примеру, мы имеем start_onboarding
и complete_onboarding
события. Я не хочу вручную вызывать эти события, но я хочу автоматически переходить между ожидающим -> in_progress -> завершенным событиями.
enum status: {
pending: 1,
in_progress: 2,
completed: 3
}
aasm column: :status, enum: true, whiny_transitions: false do
state :pending, initial: true
state :in_progress
state :completed
event :start_onboarding do
transitions from: :pending, to: :in_progress
end
event :complete_onboarding do
transitions from: :in_progress,
to: :completed,
if: :onboarding_completed?
end
end
Вы можете уточнить, что изменения могут произойти с тем, что объекты и как они соединены с Государственный аппарат? Пример может помочь придумать хорошее решение. Я не уверен, согласен ли я на 'before_save', но я согласен с тем, что какой-то шаблон наблюдателя лучше, чем у cron, как фоновая работа, потому что наблюдатель может обеспечить * реальное время *, тогда как задание cron всегда будет за. – spickermann
Не могли бы вы объяснить немного больше о том, что именно вы хотите здесь сделать. Чтобы я мог дать вам полезный ответ. –
Я просто ищу общее мнение о лучшей практике.Я добавил пример конечного автомата @PradeepAgrawal –