【问题标题】: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