2

オブジェクトのステータスを追加する必要があり、これを行うためのRailsの方法に関するヒントが必要です。どこかでステータスがモデルに追加されたのを見ましたが、それがあった場所はすでに失われています。

ステータスとは、アイテムの状態を追跡するものを意味します。{0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED}店頭での注文のように。DBに格納されているID、整数IDの代わりにコードで使用できる定数または記号、およびUI用の1つまたは2つの人間が読めるメッセージが必要なようです。

4

3 に答える 3

6

これを行うには、いくつかの簡単な方法があります。ステータスの名前が短い場合は、基本的にSamyが提案したことを実行し、モデルに直接保存します。したがって、移行では、

add_column :orders, :status, :string

次に、モデルで、statusメソッドを使用してステータスを取得できます。有効なステータスのみを保存するようにしたいので、:inclusionバリデーターは次のようになります。

class Order
  validates :status, inclusion: { in: %w(ordered changed shipped archived) },
                     presence: true
end

ステータスが長い場合は、上記のように各ステータスに短い名前を付けて実行し、メソッドを追加して完全なステータスメッセージを表示できます。

class Order

  STATUSES = { 'ordered' => 'Order placed',
               'changed' => 'A change has been made to the order',
               'shipped' => 'The order has been shipped',
               'archived' => 'The order has been archived' }

  def self.valid_statuses
    STATUSES.keys
  end

  validates :status, inclusion: { in: valid_statuses },
                     presence: true

  def extended_status
    STATUSES[status]
  end
end
于 2012-05-24T20:57:06.383 に答える
1

MagicFieldNamesはあなたが探しているものかもしれません、それはあなたが単一テーブル継承に使用できる識別子タイプの列を持っています。

より単純にしたい場合は、ステータス列を使用できます。この列の値は、注文済み変更済み、または出荷済みと同じです。Railsなどで定数を作成する必要はありません。

于 2012-05-24T19:54:40.407 に答える
1

問題にある程度の複雑さがある場合(fe:状態が多い場合、オブジェクトは状態を変更すると動作が変更されます...)、gemStateMachineを使用できます。

于 2012-05-24T20:11:48.553 に答える