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

lif*_*der 2 ruby model ruby-on-rails-3

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

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

Emi*_*ily 6

有几种简单的方法可以做到这一点.如果状态的名称很短,我基本上会做Samy建议并将它们直接存储在模型中.所以,在你的迁移中,你会这样做

add_column :orders, :status, :string
Run Code Online (Sandbox Code Playgroud)

然后,在模型中,您可以使用该status方法检索状态.您需要确保只存储有效状态,因此:inclusion验证器的内容如下:

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

如果状态较长,您可以使用上面的名称为每个状态执行非常类似的操作,然后添加其他方法以提供完整的状态消息

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
Run Code Online (Sandbox Code Playgroud)