有没有办法将 AASM 与用户配置的状态和转换一起使用?
Is there a way using AASM with states and transitions configured by user?
我将 AASM 与 rails 一起使用,我一直在寻找解决我的问题的方法,我需要制作一个由用户配置的状态机系统。
想象一下这个场景:
- 用户访问美国CRUD页面
- 用户为项目模型创建了新状态 X 和新状态 Y
- 用户为项目模型创建了从状态 X 到状态 Y 的转换
- 用户访问项目展示页面
- 用户可以在他为项目模型创建的状态之间切换
是否有使用 AASM 实现这些案例的简单方法?
我想象的是这样的:
class Project < ActiveRecord::Base
include AASM
aasm do
State.where(model_name: 'Project').each do |database_state|
state database_state[:name], database_state[:initial]
end
Event.where(model_name: 'Project').each do |database_event|
...
end
end
end
这是最终的模块文件,它像我计划的那样工作:
module WorkflowModule
def self.included(base)
base.send(:include, AASM)
base.send(:aasm, column: 'aasm_state', no_direct_assignment: false) do
start_aasm(base)
end
end
def start_aasm(base)
State.where(entity: base.name.downcase).each_with_index do |state_database, index|
if index == 0
state state_database.name.to_sym, :initial => true
else
state state_database.name.to_sym
end
end
Transition
.joins(:workflow)
.where(workflows: { entity: base.name.downcase})
.each do |transition_database|
event transition_database.name.to_sym do
transitions :from => State.where(state_from_id: transition_database.state_from_id).name.to_sym,
:to => State.where(state_to_id: transition_database.state_to_id).name.to_sym
end
end
end
end
我将 AASM 与 rails 一起使用,我一直在寻找解决我的问题的方法,我需要制作一个由用户配置的状态机系统。
想象一下这个场景:
- 用户访问美国CRUD页面
- 用户为项目模型创建了新状态 X 和新状态 Y
- 用户为项目模型创建了从状态 X 到状态 Y 的转换
- 用户访问项目展示页面
- 用户可以在他为项目模型创建的状态之间切换
是否有使用 AASM 实现这些案例的简单方法?
我想象的是这样的:
class Project < ActiveRecord::Base
include AASM
aasm do
State.where(model_name: 'Project').each do |database_state|
state database_state[:name], database_state[:initial]
end
Event.where(model_name: 'Project').each do |database_event|
...
end
end
end
这是最终的模块文件,它像我计划的那样工作:
module WorkflowModule
def self.included(base)
base.send(:include, AASM)
base.send(:aasm, column: 'aasm_state', no_direct_assignment: false) do
start_aasm(base)
end
end
def start_aasm(base)
State.where(entity: base.name.downcase).each_with_index do |state_database, index|
if index == 0
state state_database.name.to_sym, :initial => true
else
state state_database.name.to_sym
end
end
Transition
.joins(:workflow)
.where(workflows: { entity: base.name.downcase})
.each do |transition_database|
event transition_database.name.to_sym do
transitions :from => State.where(state_from_id: transition_database.state_from_id).name.to_sym,
:to => State.where(state_to_id: transition_database.state_to_id).name.to_sym
end
end
end
end