【问题标题】:Ruby AASM: trigger callbacks on model updateRuby AASM:在模型更新时触发回调
【发布时间】:2022-07-15 21:12:23
【问题描述】:

直接更新模型字段时会绕过 ASM 回调。这可以通过设置no_direct_assignment 标志来禁用,但这会破坏其他集成,例如通过active_admin 进行简单更新。

有没有办法允许对 AASM 状态字段进行模型更新并使它们表现为状态转换?

developer.update!(state: :hired) 的行为与 developer.hired! 相同。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord activeadmin aasm


    【解决方案1】:

    active_admin 提供hacky solution to work with AASM

    我想出了一种与模型无关的方法,将直接状态更新转变为转换。这也可以在常规控制器中使用,但这里有一个使用 active_admin 的示例

    ActiveAdmin.register MyModel do
      controller do
        def update
          model_key = resource_class.model_name.param_key
          aasm_columns = resource_class.aasm.events.map{ |event| event.state_machine.config.column.to_s }.uniq
          states_to_update = params[model_key].keys & aasm_columns
          events = states_to_update.map { |state_column| params[model_key].delete(state_column) }
    
          if events.any?
            record = resource_class.find(params[:id])
    
            ActiveRecord::Base.transaction do
              events.each { |event| record.send("#{event}!") }
    
              super
            end
          else
            super
          end
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多