我一直在使用AASM来制作当前项目中的状态机,并想知道自动调用事件并进入下一个状态的最佳方式是什么?什么是自动改变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
你能否详细说明会发生什么对象什么样的变化以及它们是如何连接到状态机?一个例子可能有助于提出一个好的解决方案。我不确定我是否同意'before_save',但我同意某种观察者模式比背景作业更好,因为观察者可以提供*实时*体验,而cron作业总是背后。 – spickermann
您能否请您详细解释一下您在这里要做什么。所以我可以给你一个有用的答案。 –
我只是寻找一个最佳实践的一般意见。我已经添加了一个状态机的示例@PradeepAgrawal –