忽略非線性狀態機的問題,我發現以下很好地滿足我的需要的幾個項目,簡單的狀態機工作:
# 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」僅僅是一個數組,其階段按從初始到最終的順序排列。
我們只是從列表中刪除項目,然後檢查我們的對象的當前舞臺是否在我們的結果列表中。如果我們想知道它是在某個階段還是在某個階段之前,我們會移除後續階段,直到達到我們提供的測試階段,如果我們想知道它是否在給定階段之後,我們會從列表的前面移除項目。
我知道你可能不需要這個答案了,但希望它可以幫助別人=]
有趣的解決方案。我認爲它適用於我的特殊情況,但有一些事情需要考慮。 1)你複製了州申報的地方;一次在aasm聲明中,另一次在數組中。 2)狀態機可能有多個「分支」,這只是一個分支情況。 – 2014-11-03 14:37:14
1)是 - 我知道這一點,但是您需要以某種方式聲明訂單。 2)有分支時,可能會出現一些狀態實際上沒有可比性。考慮這個:http://faculty.kutztown.edu/rieksts/225/study/spring07/test3-ans_files/image006.jpg哪個元素大8或6?其實 - 我們不知道。我認爲在這裏需要假設線性排序來考慮這個問題。 – Esse 2014-11-03 23:56:06