【问题标题】:How a state machine gem saves data in Rails app?状态机 gem 如何在 Rails 应用程序中保存数据?
【发布时间】:2013-12-18 21:59:14
【问题描述】:

Worflow 是一个状态机红宝石。以下是其在 github 上的文档中的代码示例:

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

Gem 工作流程已添加到模型文章中。这里有两个问题:

  1. gem 工作流在哪里保存文章状态数据?在 Rails 应用程序的数据库中?假设工作流程已集成到 rails 应用程序中。或者问题可能更笼统:gem 工作流如何保存文章状态数据?
  2. 通过在模型文章中添加工作流,是否会在表格文章中添加更多列用于状态数据存储?如果有,这种表结构的变化何时发生?

【问题讨论】:

    标签: ruby-on-rails state-machine


    【解决方案1】:

    我认为如果您希望将工作流 gem 保存到数据库中,您必须在表中创建一个名为 workflow_state 的字符串字段列(请参阅 Integration with ActiveRecord

    class AddWorkflowToArticlesTable < ActiveRecord::Migration
      def change
        add_column :articles, :workflow_state, :string
      end
    end
    

    like 应该可以工作,然后article.state 应该反映数据库中保存的内容

    希望对你有帮助

    【讨论】:

    • 如果我们想记录更多关于每个转换的数据,例如用户 ID、时间戳和评论,我们是否需要为我们计划保存的额外数据创建自己的表?
    • 是的,这可能也是我的策略,可能是属于用户的评论表之类的东西
    • 我们如何在工作流定义中指定谁可以触发事件?例如,只有采购方可以提交 PO,CEO 可以批准。我们可能需要自己创建用户组映射表。假设已经有一个用户的映射表。
    【解决方案2】:

    在内存中。如果选择了该选项,还可以通过 Active Record 访问数据库。

    来自:https://github.com/geekq/workflow - 大约下降了 1/3。

    与 ActiveRecord 集成

    工作流库可以全自动处理状态持久化。您只需在表上定义一个名为 workflow_state 的字符串字段,并像往常一样在模型类中包含工作流混合:

    class Order < ActiveRecord::Base
      include Workflow
      workflow do
        # list states and transitions here
      end
    end
    

    【讨论】:

    • 如果是到数据库,那么表文章是否有表结构变化?内存中的数据是短暂的,但一个工作流可能会持续很长时间并且涉及不同的用户组。
    • 无结构变化,类存储。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多