我需要为对象添加状态,并且需要有关 Rails 方式的提示来执行此操作。我在某个地方看到状态被添加到模型中,但已经丢失了它的位置。
状态,我的意思是跟踪项目状态的东西。喜欢{0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED}
在商店订购。看起来它需要存储在数据库中的 id、我可以在代码中使用的常量或符号而不是整数 id,以及一两个人类可读的 UI 消息
我需要为对象添加状态,并且需要有关 Rails 方式的提示来执行此操作。我在某个地方看到状态被添加到模型中,但已经丢失了它的位置。
状态,我的意思是跟踪项目状态的东西。喜欢{0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED}
在商店订购。看起来它需要存储在数据库中的 id、我可以在代码中使用的常量或符号而不是整数 id,以及一两个人类可读的 UI 消息
有几种简单的方法可以做到这一点。如果状态名称很短,我基本上会按照 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
MagicFieldNames可能是您正在寻找的,它有一个鉴别器类型列,您可以将其用于Single Table Inheritance。
如果你想要更简单,你可以使用一个状态列,它的值可以等于ordered、changed或shipping。你甚至不需要在 Rails 或类似的东西中创建常量。
如果问题有一些复杂性(fe:很多状态,对象在更改其状态时会更改其行为......),您可以使用 gem StateMachine。