0

モデルがあり、このモデルの列は状態を表します。これは数値であり、1、2、3 の可能性があります。

私は2つの懸念があります:

a) ビジネス ロジックに基づいて、状態は 1 から 2 および 2 から 3 にしか移行できません。高い数値から低い数値に戻ることはできず、1 ステップで 1 から 3 に戻ることもできません。

b) これらの数値をコントローラーに公開したくありません (魔法の数値が飛び交うのは好きではありません)。

私は次のことをしました

  • stateX?、stateY?、stateZ? などのメソッドを作成しました。コントローラーが現在の状態を確認できるようにします。これは、懸念事項b)に役立ちます。

  • コントローラーが容認できない状態の切り替えを行う場合、メソッド setStateX、setStateY、stateZ、および raise を作成しました。これは、a) と b) の懸念に役立ちます。

ただし、それは Java/C++ の方法 (これが私のバックグラウンド) であると感じています。つまり、1 つのことを行うための 6 つのメソッドです。

RoRでこれを達成するためのより良い方法はありますか?

4

2 に答える 2

1

これがまだ最善の方法であるかどうかはわかりませんが(私のRailsは少し錆びています)、acts_as_state_machineという宝石があります。これはあなたが望むことを正確に実行すると思います。

于 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 に答える