AASM 从一个状态过渡但不包括一个状态

AASM transition from but except one state

我有带 ActiveRecord 模型的 AASM。

有许多状态和事件及其转换。 我想创建允许从除一个状态以外的任何状态转换的事件。

event :set_vacant_pass do
  transitions to: :vacant_pass, from: ??
end

经过一番挖掘,我决定采用简单的解决方案:

event :set_vacant_pass do
  transitions to: :vacant_pass, from: Vacation.man_statuses.except('vacant_pass').keys
end

这将允许事件从除 vacant_pass 以外的任何状态转换。

man_status 是枚举列并用于 AASM

乱七八糟的语法可能并不完美,但您可以使用列表明确指定。假设要从 "new"、"created" 和 "closed":

过渡到 "vacant_pass" 的有效状态
event :set_vacant_pass do
  transitions from: [:new, :created, :closed], to: :vacant_pass
end

或者你可以使用守卫

event :set_vacant_pass do
  transitions_from: Vacations.man_statuses.keys, to: :vacant_pass, guard: :transition_valid?
end

def transition_valid?
  self.state == :vacant_pass
end

添加了额外的,你可以使用

ClassName.aasm.states.map(&:name)

获取包含您的 class 所有可能状态的符号数组。