问题是,状态机是否总是静态定义(在类上)?或者有没有办法让我拥有它,所以类的每个实例都有它自己的一组状态?
我正在检查Stonepath以实现任务引擎。我并没有真正看到“状态”和“任务”之间的区别,所以我想我可以直接将一个任务映射到一个状态。这将使我能够动态定义任务列表(或工作流),而无需执行以下操作:
aasm_event :evaluate do
transitions :to => :in_evaluation, :from => :pending
end
aasm_event :accept do
transitions :to => :accepted, :from => :pending
end
aasm_event :reject do
transitions :to => :rejected, :from => :pending
end
相反,一个 WorkItem(主要的工作流/任务管理器模型)只会有很多任务。然后任务会像状态一样工作,所以我可以做这样的事情:
aasm_initial_state :initial
tasks.each do |task|
aasm_state task.name.to_sym
end
previous_state = nil
tasks.each do |tasks|
aasm_event task.name.to_sym do
transitions :to => "#{task.name}_phase".to_sym, :from => previous_state ? "#{task.name}_phase" : "initial"
end
previous_state = state
end
但是,我不能用aasm gem做到这一点,因为这些方法 (aasm_state
和aasm_event
) 是类方法,因此具有该状态机的类的每个实例都具有相同的状态。我想要它,所以“WorkItem”或“TaskList”会根据它所拥有的任务动态地创建一系列状态和转换。
这将允许我动态定义工作流,并且只需将状态映射到任务。
状态机曾经这样使用过吗?似乎这个ruby 工作流 gem与我所描述的相似。
更新:我可以看到做类似以下的事情,但它似乎有点骇人听闻:
@implementation_state_machine = Class::new do
include AASM
aasm_initial_state :initial
tasks.each { |state| aasm_state :"#{task.name}"}
# ...
end
...我的模型上的属性将在哪里implementation_state_machine
。我必须重写method_missing
以将与状态相关的方法 ( accepted_phase?
) 委托给实现匿名类。