2011-09-20 56 views
1

我有一个使用state_machine gem(https://github.com/pluginaweek/state_machine)来跟踪模型状态的Rails 3.1应用程序。和state_machine-audit_trail gem(https://github.com/wvanbergen/state_machine-audit_trail)保存状态更改。使用state_machine&state_machine_audit_trail返回到之前保存的状态

#State Machine states for Work Orders 
state_machine :initial => :created do 
after_transition :on=>:validate, :do=>:create_report 

store_audit_trail 
    event :validate do 
    transition :created => :validated 
    end 
    event :reject do 
    transition :created => :rejected 
    end 
end 

有一种独特的状态“拒绝”这是暂时的,我正在寻找一种方式来触发一个事件到模型返回为保存在WorkOrderStateTransition模型中的前一个状态(通过审计提供宝石)。

我创建了一个方法'previous_state',它发现最后一个状态转换,并且当通过控制台调用该方法时,它确实返回了以前的状态名称

问题是我无法在state_machine转换中调用该方法以将其用作还原的目标状态。举例来说,像这样的东西是行不通的:

event :restore do 
    transition :rejected => lambda {|wo| wo.previous_state} 
    end 

我得到的状态是一个Proc。

我原以为这是一个非常常见的用例(回到以前保存的状态),但是我在搜索时发现了很少的信息。唯一相关的帖子是Using pluginaweek's state_machine, can I reference the activerecord object during an event?但是这不使用审计宝石提供的工作流历史记录,并且还将状态返回到“恢复”状态,这不是我所需要的。

有没有人遇到过这个相同的用例?我对Ruby/Rails有点新鲜,我意识到这可能完全是由于我对lambda表达式和变量作用域缺乏理解,但我一直在为这个问题奋斗了几天,并且确实可以使用一些帮助!

谢谢!

+0

Aww加油! _Tumbleweed_徽章? – SimonMD

回答

2

你打破了什么样的状态机被认为是。这有点像把一块石头扔进喷气涡轮机里。您的代码在某些时候会变得不清楚,导致难以调试。

为了让你在这里一个很好的故事是,我是不是很久以前面临着一个问题,你要知道这是做作,可能不适合你的情况

我有一个用户

+------------+ 
    |   | 
    v   | 
Active --> Suspended --> Removed 
    |   ^| 
    v   | | 
Inactive -----+ | 
^   | 
    |    | 
    +--------------+ 

您能否发现问题?如果我是一位非活动用户且被暂停的用户会发生什么情况,我如何才能知道将用户转储回来以激活他们?如果我是一名活跃的用户,我将如何返回活跃状态?

我想出了解决的办法是删除Suspended --> Inactive情况

TL;医生认为你的状态和简化他们或将在疯狂的情况下之间的中间步骤。不要强迫某个不是为此目的而设计的系统