在Rails中添加状态的最佳实践

时间:2012-05-24 19:28:34

标签: ruby ruby-on-rails-3 model

我需要为对象添加状态,并需要提示有关Rails方法的信息。在某个地方,我看到状态被添加到模型中,但已经丢失了。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

MagicFieldNames可能就是您要找的内容,它有一个可用于Single Table Inheritance的识别器类型列。

如果您想要更简单,可以使用 status 列,该值可以等于 ordered 已更改已发送。你甚至不需要在Rails中创建常量或者这样的东西。

答案 2 :(得分:1)

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