【问题标题】:Are there Ruby on Rails workflow gems with user-defined states?是否有具有用户定义状态的 Ruby on Rails 工作流 gem?
【发布时间】:2016-02-17 05:08:25
【问题描述】:

我开发 Ruby on Rails 应用程序,现在正在寻找无需任何编程即可配置状态的工作流 gem。

我发现了一些宝石:rails_workflowstate_machineworkflow

但据我了解,这些 gem 假定状态将是硬编码的,例如 workflow gem states:

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

我需要我的应用程序用户状态可以自己配置状态和转换条件,无需开发人员。

Redmine 已经有这个功能,但它是现成的系统,不是我可以连接到我的应用程序的 gem

有没有具有这种功能的宝石?

【问题讨论】:

  • 很想知道任何解决方案;我可以写一个有想法的答案,但我没有找到宝石
  • 你可以使用这个解决方案,我发现它很有希望阅读它,但我认为这个解决方案可以扩展到任何用途:stackoverflow.com/questions/14349141/…
  • 我不会推荐workflow gem...我继承了一个使用它的旧版应用程序,我发现它有问题——这并不奇怪,因为它不再被维护。我之前使用过AASM 并且没有遇到任何问题,尽管它不是为基于数据库的工作流而设计的。我没有使用过rails_workflow,但它声称已经支持用户可配置的工作流程。

标签: ruby-on-rails rubygems workflow


【解决方案1】:

我根据之前的评论设计了以下解决方案。使用 gem state_machine,然后您可以使用 ActiveRecord 定义状态机的转换,如下所示:

定义一个包含“to”、“from”和“on”列的转换模型。他们都将string 作为他们的数据类型。

状态将定义如下:

Transition.create(:from => "parked", :to => "idling", :on => "ignite")

在这之后你需要修改你的转换方法如下:

def transitions
  transitions_data = []
  Transition.all.each do |transition|
    transitions_data << { transition.from.to_sym => transition.to.to_sym, :on => transition.on.to_sym }  
  end
  transitions_data
end

显然,如果您有不止一台机器,您可以有一些其他列,例如“machine_name”,并将机器名称存储在那里并仅获取这些行。

正如最初回答这个问题的人所说“这只是一个例子,可以进一步优化。我会把这部分留给你。希望这会给你一个好的开始。”

我希望这会为您指明正确的方向。

来源:

SOstate_machine Gem

【讨论】:

  • 我喜欢这种方法!!
【解决方案2】:

rails_workflow gem 与状态无关 :)

大多数状态转换引擎使用状态来模拟本质上是错误的流程配置。如果某些应用程序具有流程(意味着具有不同操作、用户操作、任务等的业务逻辑流程) - 那么它应该使用流程管理,并且大多数具有状态到状态转换的 gem 使用状态转换只是为了粗略地模拟工作流程。

状态转换逻辑也有很多缺点 - rails_workflow 与状态无关 :) 它与流程配置、监视和控制有关。

【讨论】:

    【解决方案3】:

    您可以复制 redmine ,或使用此 gem 轻松构建自己的服务对象:

    Waterfall

    这是一个全新的宝石,我本周在 RubyLille 遇到了他的作者。 这是一种优雅地链接类似回调的方法并获得由 rails 管理的错误的方法,您可以使用它构建一个健壮的状态机。

    【讨论】:

    • OP 将如何从Waterfall 的数据库中定义状态,一个示例可能会有所帮助。
    • 我不确定我清楚地理解你的问题,请转用“OP”。
    • 我的意思是,我们如何在Waterfall 中不进行实际编码的情况下定义状态。 OP 想从数据库中定义状态,而我在 Waterfall 中没有看到,或者我错过了一些东西,所以我问你一个例子。
    • @plombix,OP翻译为原创海报
    • 我不明白,我认为这是代码的美学问题。瀑布制作了一个优雅的结构来支持模型的验证和方法/范围,它不会自己定义状态,我的错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2011-01-13
    相关资源
    最近更新 更多