0

我有一个模型,这个模型的一列代表一个状态。它是数值,可以是 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 中是否有更好的方法来实现这一点?

4

2 回答 2

1

不确定这是否仍然是最好的方法(我的 Rails 有点生锈),但有一个名为acts_as_state_machine的gem ,我认为它可以完全满足您的要求。

于 2012-06-25T16:33:08.950 回答
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
于 2012-06-26T14:04:51.213 回答