【问题标题】:Need clarification of Ruby state machine usage需要澄清 Ruby 状态机的使用
【发布时间】:2015-01-04 19:18:36
【问题描述】:

我的问题是我的应用程序让用户能够定义工作流程(状态、转换、事件等),并让我的应用程序知道它如何根据用户工作流程做出反应(转换)。

我查看了几个状态机 gem,例如 AASM,我看到了如何使用 gem 来预定义状态机但是如果状态机需要更改,看起来我必须修改代码并重新部署。我一直在与我的同事争论我们如何能够/不能利用状态机 gem 来做我们想做的事情,但对我来说,它们似乎都定义了一个静态状态机,并且对该状态机的更改需要更改代码。

他的建议是动态修改 Ruby 类以匹配用户工作流程的变化。我的想法是状态、转换、事件、守卫等是用户通过我们的 API 修改的可持久对象。我们目前的思路似乎都不适用于current Ruby state machines,除非在这些宝石之上进行一些重大修改。

我一直关注的示例解决方案是 JIRA,以及如何为项目动态定义状态、转换和其他工作流属性。

【问题讨论】:

  • 我简要查看了 AASM gem,看起来状态机规则存储在类中。每次状态机规则改变时你就不能创建一个新类吗?
  • 动态地,即。 (对不起,额外的评论,这个网站不让我编辑 cmets 出于某种原因)
  • 这似乎是争论之一。我们创建一个定义状态机的配置文件或对象,并将其转换为可由 AASM(或任何状态机)解释的动态 Ruby 类。论点的另一半是对状态机类进行建模,以便它们可以被持久化并让这些对象用于驱动状态机。我们真的不知道执行此操作的最佳方法,但所有状态机 gem 似乎都希望静态定义状态机并且只保留对象的当前状态。

标签: ruby-on-rails ruby acts-as-state-machine


【解决方案1】:

预定义业务逻辑时应使用状态机,否则应以不同的方式对其进行建模。如果您希望用户创建自己的工作流程(例如状态、转换、事件),那么为状态、转换和事件创建单独的模型并在代码中定义它们的关系是有意义的。

然后,您可以拥有多种转换和事件,这些转换和事件具有不同的结果。如果你能详细描述你需要什么样的动态工作流程,我可以告诉你更多信息——目前正在从事类似的项目,尽管我们还没有在工作流程中引入事件和转换

【讨论】:

    【解决方案2】:

    【讨论】:

    • 那颗宝石肯定接近我正在寻找的东西,但它的开发在很久以前就已经枯竭了。此后引起我注意的另一件事是这颗宝石,rails_workflow。我还没有真正使用过它,但它似乎最适合我的用例。
    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 2011-11-09
    • 2012-07-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多