我一直在使用AASM在我当前的项目中制作状态机,并且想知道自动调用事件并进入下一个状态的最佳方式是什么?
我正在考虑两种方法:
设置后台作业以定期检查是否满足某些条件,因此调用事件以进入下一个状态。
调用
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