Techioz Blog

複数の構成ファイルを保存して使用できる yaml 構成を使用して、オンザフライでステート マシンを作成するにはどうすればよいですか?

概要

私の Rails アプリケーションには FSM を構築するという要件があり、その FSM は構成可能でなければなりません。私のアプリケーションでは、従業員が組織から退職する前に完了する必要があるいくつかのプロセスを含む従業員退職ワークフローを作成しています。そして、アプリケーションの各組織は、たとえば、この状態が遷移したときにどのイベントをトリガーするかなど、独自の終了設定を保存できる必要があるという点が重要です。それらは、状態が遷移できる外部イベントなどにすることができます。

aasm gemを試しましたが、状態を動的に作成できる機能が見つかりませんでした

解決策

これらの行に沿って、適切なモデルで yaml ファイルを使用できるようにする必要があります。

include AASM

  
  def apply_custom_configuration(config_file_path)
    config = YAML.load_file(config_file_path)

    aasm do
      config['states'].each do |state|
        aasm_state state['name'].to_sym, initial: state['initial'] || false
      end

      config['events'].each do |event|
        aasm_event event['name'].to_sym do
          transitions from: event['from'].map(&:to_sym), to: event['to'].to_sym
        end
      end
    end
  end

次に、これらの線に沿ったものを、実際の従業員の退職が実行される場所で使用できます。

config_file_path = Rails.root.join('config', 'employee_exit_workflows', 'organization1.yaml')
employee_exit = EmployeeExit.new
employee_exit.apply_custom_configuration(config_file_path)

カスタム ワークフローをデータベースに保存してみてはどうでしょうか?

データベースにデータを永続化するには:

データベースに保存するためのスニペットは次のとおりです。

config = YAML.load_file('path_to_your_yaml_file.yaml')
custom_workflow = CustomWorkflow.new(organization: 'org_name', config: config)
custom_workflow.save

上のスニペットでは、新しいテーブルにフィールドが 2 つだけあることを前提としていますが、ニーズに合わせて変更できます。

次に、次のようにしてカスタム ワークフローを取得できます。

workflows = CustomWorkflow.where(organization: 'org_name')