gpt4 book ai didi

ruby-on-rails - 检查状态是否超过 aasm 中的另一个状态?

转载 作者:行者123 更新时间:2023-12-04 05:52:46 25 4
gpt4 key购买 nike

假设有一个对象有4个状态

:new
:in_process
:done
:verified

还有一个方法只应在对象处于大于:in_process的状态时执行

我该如何进行这项检查?我想这可能是什么

def some_action
return unless my_object.state > :in_process
#do some work
end

但这只是比较字符串。

我是不是遗漏了什么,或者是否有一种实际的方法可以执行这样的检查?

谢谢。

最佳答案

忽略非线性状态机的问题,我发现以下内容可以很好地满足我在一些使用简单状态机的项目中的需求:

# Check if the stage is in or before the supplied stage (stage_to_check).
def in_or_before_stage?(stage_to_check)
if stage_to_check.present? && self.stage.present?
STAGES_IN_ORDER.reverse.lazy.drop_while { |stg| stg != stage_to_check }.include?(self.stage)
else
false
end
end

有时还需要其他检查:

# Check if the stage is in or after the supplied stage (stage_to_check).
def in_or_after_stage?(stage_to_check)
if stage_to_check.present? && self.stage.present?
# Get all the stages that are in and after the stage we want to check (stage_to_check),
# and then see if the stage is in that list (well, technically in a lazy enumerable).
STAGES_IN_ORDER.lazy.drop_while { |stg| stg != stage_to_check }.include?(self.stage)
else
false
end
end

其中“STAGES_IN_ORDER”只是一个数组,其中的阶段按从初始到最终的顺序排列。

我们只是从列表中删除项目,然后检查对象的当前阶段是否在结果列表中。如果我们想知道它是在某个阶段还是在某个阶段之前,我们会删除后面的阶段,直到我们提供的测试阶段,如果我们想知道它是否在某个给定阶段之后,我们会从列表的前面删除项目。

我知道你可能不再需要这个答案,但希望它能帮助别人=]

关于ruby-on-rails - 检查状态是否超过 aasm 中的另一个状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com