我们在Rails应用程序中使用Geekq/workflow。这里有一个例子:
class Article
include Workflow
workflow do
state :new do
event :submit, :transitions_to => :awaiting_review
end
state :awaiting_review do
event :review, :transitions_to => :being_reviewed
end
state :being_reviewed do
event :accept, :transitions_to => :accepted
event :reject, :transitions_to => :rejected
end
state :accepted
state :rejected
end
end
很容易发现一个状态,例如:awaiting_review
是否已经通过:
article.current_state < :awaiting_review
但是,我们没有找到一种方法来检查事件是否已被激发。通过工作流的内置方法,检查事件是否已被触发是可能的吗?或者,如果没有此工作流,其他任何工作流都可以?
因此,您可以捕获on_create和on_cpdate的事件,因为ActiveRecord中存在针对它的回调,但对于工作流中的change_state,您需要通过以下方式覆盖工作流的转换:
class Article < BaseModel
include Workflow
workflow do
state :new do
event :submit, :transitions_to => :awaiting_review
end
state :awaiting_review do
event :review, :transitions_to => :being_reviewed
end
state :being_reviewed do
event :accept, :transitions_to => :accepted
event :reject, :transitions_to => :rejected
end
state :accepted
state :rejected
on_transition do |from, to, event, *event_args|
self.update_attribute(:status, to)
# this triggers on_update callback on workflow transition
# which you can use to log the event now
end
end
end
class BaseModel < ActiveRecord
after_commit :log_create_event, on: [:create]
after_commit :log_update_event, on: [:update]
after_commit :log_destroy_event, on: [:destroy]
def log_create_event
#log_event('Create')
end
def log_update_event
#log_event('Update')
end
def log_destroy_event
#log_event('Destroy')
end
end