如何在ActiveRecord模型的AASM中创建排除特定状态的转场事件?
解决AASM多状态转场排除特定状态的问题
嘿,我来帮你搞定这个AASM的状态转场配置问题~你想要创建一个set_vacant_pass事件,允许从除某一个特定状态外的所有状态转至:vacant_pass,有两种实用的配置方式:
方法1:手动列出允许的状态(适合状态固定的场景)
如果你的模型状态是固定不变的,直接把所有允许转场的状态列出来就行,只排除那个不需要的状态。比如假设你要排除的状态是:occupied,其他状态是:active、:inactive、:pending,代码可以这么写:
event :set_vacant_pass do transitions to: :vacant_pass, from: [:active, :inactive, :pending] end
方法2:动态生成允许的状态(适合状态可能新增的场景)
如果后续可能会给模型新增状态,手动维护数组太麻烦,用lambda动态获取所有状态并排除指定状态会更灵活:
event :set_vacant_pass do transitions to: :vacant_pass, from: lambda { |obj| obj.class.aasm.states.map(&:name) - [:excluded_state] } end
这里需要把:excluded_state替换成你实际要排除的那个状态(比如:booked、:locked之类的)。这段代码的逻辑是:通过obj.class.aasm.states.map(&:name)获取当前模型所有已定义的AASM状态名称数组,再用数组减法去掉你不想允许转场的那个状态,这样不管以后新增多少状态,这个转场规则都会自动生效,不用手动修改from参数。
内容的提问来源于stack exchange,提问作者alexey_the_cat
相关产品推荐
相关产品推荐

