Domanda

I am trying to figure out how to implement a dynamic approval system in Rails. The scenario is this: I have a model object (a document) which, when created, the user can assign an approval flow to. The document can be filled and submitted by a user. The document then goes through the approval flow before being "approved".

For example, let's say I create a "leave request" document. As a user I can then claim that the leave request must be approved by my line manager and someone from HR before being in the state "approved".

I have explored using a number of state-machine gems and CanCan for permissions, but I cannot wrap my head around how to dynamically create these workflows. I thought about serializing the workflow in the database, but this means that every time I want to determine a document approvers list of documents awaiting approval I will have to deserialize every workflow in the list of documents in the "awaiting approval" state.

Has anyone got any ideas as to how to tackle this problem?

È stato utile?

Soluzione

I think the best solution is to use separate table for storing approvers. You can dynamicly create 'approvers' when you create a document and then change each 'approver' independing of others. A document is approved if it does not have unapproved 'approvers'.

class Approver < ActiveRecord::Base
  attr_accessible :approved, role, ...
  # where role is manager or someone from HR or ...
  # approved is a status (true or false)

  belongs_to :document
  ...
end

class Document < ActiveRecord::Base
  has_many :approvers

  def approved?
    approvers.where(approved: false).empty?
  end

  ....
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top