ruby - Rails 中添加状态的最佳实践

标签 ruby ruby-on-rails-3 model

我需要为对象添加状态,并且需要有关 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

关于ruby - Rails 中添加状态的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744059/

相关文章:

mysql - 监控服务器上的应用程序

ruby-on-rails - 处理带子域的 RoR 应用程序的建议

ruby - 向 Rails 3 中的延迟作业添加一些自定义方法?

ruby-on-rails-3 - 使用 Carrierwave、Fog 到 S3 的 Rails 上传 - HTTP 与 HTTPS

c# - 当我在模型类中使用导航属性时出现空引用异常

ruby - 在 Ruby 中,如何实现一个类,其新方法创建其自身的子类?

ruby - Ruby 方法可以接受 block 或参数吗?

ruby-on-rails - Rails 3.0 发送邮件安全最佳实践

go - beego 模型错误

eclipse - 为 libgdx 构建新 Gradle 项目模型时出错