2

我需要为对象添加状态,并且需要有关 Rails 方式的提示来执行此操作。我在某个地方看到状态被添加到模型中,但已经丢失了它的位置。

状态,我的意思是跟踪项目状态的东西。喜欢{0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED}在商店订购。看起来它需要存储在数据库中的 id、我可以在代码中使用的常量或符号而不是整数 id,以及一两个人类可读的 UI 消息

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可能是您正在寻找的,它有一个鉴别器类型列,您可以将其用于Single Table Inheritance

如果你想要更简单,你可以使用一个状态列,它的值可以等于orderedchangedshipping。你甚至不需要在 Rails 或类似的东西中创建常量。

于 2012-05-24T19:54:40.407 回答
1

如果问题有一些复杂性(fe:很多状态,对象在更改其状态时会更改其行为......),您可以使用 gem StateMachine

于 2012-05-24T20:11:48.553 回答