【问题标题】:Best practices for status addition in RailsRails 中添加状态的最佳实践
【发布时间】:2012-05-24 19:28:34
【问题描述】:

我需要为对象添加状态,并且需要有关 Rails 方式的提示来执行此操作。我在某个地方看到状态被添加到模型中,但已经丢失了它的位置。

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

【问题讨论】:

  • 关于项目状态的一些信息。像 {0: :ORDERED, 1: :CHANGED, 2: :SHIPPED, 3: :ARCHIVED} 用于在商店订购。看起来它需要存储在数据库中的 id、我可以在代码中使用的常量或符号而不是整数 id,以及一两个人类可读的 UI 消息。
  • 感谢@Samy,找到了我要找的东西:[RoR 中的简单状态实现][1] [1]:stackoverflow.com/questions/2650897/…

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


【解决方案1】:

有几种简单的方法可以做到这一点。如果状态的名称很短,我基本上会按照 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

【讨论】:

  • 谢谢
【解决方案2】:

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

【讨论】:

  • 这看起来有点矫枉过正,我只需要 4 或 5 个状态和支持它们的极其简单的逻辑,而且我自己也不知道如何以正确的方式做这类事情。无论如何,谢谢你的建议,我会试一试的。
  • 还有另一种更简单的方法。创建一个“状态”列和一个名为 STATES 的全局变量,其中列出了所有可能的状态。您可以将全局变量放在项目类声明的开头。还要添加一个 validates_inclusion_of :state, :in => STATES。我想说这是最 Rubyist 的做法。
【解决方案3】:

MagicFieldNames 可能是您要查找的内容,它有一个鉴别器 type 列,您可以将其用于Single Table Inheritance

如果您想要更简单,您可以使用 status 列,其值可以等于 orderedchangedshipped时间>。你甚至不需要在 Rails 或类似的东西中创建常量。

【讨论】:

  • 感谢您的评论。我是 Ruby 和 Rails 的新手——也许我在你的链接下找不到任何有用的东西:(
  • 我不完全确定,但这似乎是唯一的 native 方式来做你想做的事。我用更简单的解决方案更新了我的答案。
  • 仍然找不到关于这个魔法领域的信息,我确定是我的错,到时候找到这个。但是谷歌搜索“状态栏”给了我我正在寻找的东西。
猜你喜欢
  • 2014-02-20
  • 2012-03-20
  • 2014-02-20
  • 2010-09-06
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多