我有一个模型,这个模型的一列代表一个状态。它是数值,可能是1,2,3。
我有两个问题:
a)根据业务逻辑,状态只能从1到2,从2到3。它不能从较高的数字返回到较低的数字,而不能只在1到3之间步骤
b)我不想将这些数字暴露给控制器(不喜欢飞来飞去的神奇数字)。
我做了以下
我创建了stateX?,stateY ?, stateZ等方法?允许控制器检查当前状态。 这有助于我关注b)。
如果控制器执行了不可接受的状态切换,我创建了方法setStateX,setStateY,stateZ和raise。这有助于我关注a)和b)。
但是,我觉得Java / C ++方式更多(这是我的背景) - 6种方法可以做一件事。
在RoR中有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
不确定这是否仍然是最好的方法(我的Rails有点生锈)但是有一个名为acts_as_state_machine的宝石,我认为它会完全符合您的要求。
答案 1 :(得分:0)
这个怎么样:
class Something < ActiveRecord::Base
before_create :check_state
private
def check_state
if state_changed?
if state_was == 1 && state != 2
self.errors.add(:state, "some message")
elsif state_was == 2 && state != 3
self.errors.add(:state, "some message")
else
self.errors.add(:state, "some message")
end
end
end
end