我需要为对象添加状态,并需要提示有关Rails方法的信息。在某个地方,我看到状态被添加到模型中,但已经丢失了。
按状态,我的意思是跟踪项目状态。就像商店中的订单{0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED}
一样。看起来它需要存储在DB,常量或符号中的id,我可以在代码中使用而不是整数id,以及用于UI的一个或两个人类可读消息
答案 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。