有没有能够定义用户状态的Ruby on Rails工作流宝石?

4
我开发 Ruby on Rails 应用程序,现在正在寻找工作流 gem,它可以允许配置状态而无需编程。
我找到了一些 gems:rails_workflowstate_machineworkflow
但是据我所知,这些 gems 假定状态将被硬编码,例如 workflow gem 的状态:
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。是否有任何带有这种功能的gems?

很想知道这个问题的解决方案;我可以写一个带有想法的答案,但我还没有找到一个宝石。 - Richard Peck
2
你可以尝试这个解决方案,我在阅读时发现它很有前途,而且我认为这个解决方案可以扩展到任何用途:http://stackoverflow.com/questions/14349141/how-do-i-create-dynamic-definitions-for-state-machine-based-on-user-defined-data - Jagjot
我不建议使用 workflow gem... 我继承了一个使用它的遗留应用程序,并发现它存在很多问题——这并不奇怪,因为它已经不再维护了。我以前使用过 AASM 并没有遇到任何问题,尽管它不是为基于数据库的工作流程设计的。我没有使用过 rails_workflow,但据说它已经支持用户可配置的工作流程。 - iconoclast
3个回答

5
我从之前的评论中想出了以下解决方案。使用gem state_machine,然后您可以像下面这样使用ActiveRecord定义状态机的转换:
定义一个Transition模型,其列名为“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


我喜欢这种方法!! - Sankalp Singha

2

rails_workflow gem并不是与状态相关的 :)

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

状态转换逻辑存在许多缺点,因此再次强调-rails_workflow与状态无关 :) 它关注的是进程配置、监控和控制。


1
您可以使用这个宝石轻松地复制Redmine,或者构建自己的服务对象: Waterfall 这是一个全新的宝石,我在RubyLille这个星期遇到了他的作者。它是一种优雅地链接类似回调的方法并由Rails管理错误的方式,您可以使用它构建一个强大的状态机。

OP将如何在Waterfall中从数据库定义状态,一个示例可能会有所帮助。 - Jagjot
我不确定我清楚地理解了你的问题,请问“OP”是什么意思? - plombix
我的意思是,我们如何在“瀑布流”中定义状态而不进行实际编码。OP想要从数据库中定义状态,但我没有在“瀑布流”中看到这一点,或者可能我错过了什么,所以我向您请求一个例子。 - Jagjot
1
@plombix,OP的意思是原帖发布者。 - Aaron Washburn
我没有理解那个,我以为那只是代码美学的问题。 瀑布模型可以创建一个优雅的结构来支持模型的验证和方法/作用域,但它本身不会定义状态,我的错。 - plombix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接