【问题标题】:How can I store a symbol in a Rails 4 model?如何在 Rails 4 模型中存储符号?
【发布时间】:2014-10-10 12:03:51
【问题描述】:

我经常需要存储一个常量。符号很适合定义常量类型,但我不知道如何在 Rails 模型中定义它们。我会创建一个单独的模型来存储类型。例如,我有一个具有status 属性的Game 模型。

class Game < ActiveRecord::Base
  has_one :status
end

status 属性是与另一个名为 Status 的模型的关联。 status 表有四行,每行定义一个不同的status,每个status 都有一个字符串名称属性。

def change
  create_table :statuses do |t|
    t.belongs_to :game
    t.timestamps
  end
end

但这感觉效率低下且错误。理想情况下,我可以在Game 表中有一列存储符号/常量。这可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你的游戏状态可以被认为是一个枚举类型。我非常喜欢将这些作为记录存储在单独的数据库表中。它使它们易于重命名和迁移,同时保持数据完整性。

    您可能还想尝试 Rails 4.1 中新增的“枚举”功能。您可以简单地声明如下内容

    class Game
      enum :status => %w[Init Pause Play End]
    end
    

    请注意,您需要添加一个整数类型的“状态”列来支持这一点。

    欲了解更多,请尝试阅读 http://robots.thoughtbot.com/whats-new-in-edge-rails-active-record-enum http://richonrails.com/articles/active-record-enums-in-ruby-on-rails-4-1

    【讨论】:

      【解决方案2】:

      我会创建一组常量来表示可能的状态范围。这些将作为整数存储在数据库中。这些整数可以与 Game::Over 进行比较,例如在代码中。

      class Game
        NotStarted = 0
        InPlay     = 1
        Over       = 2
      
        ...
      end
      
      puts "let's get started!" if Game.find(id).status == Game::NotStarted
      

      【讨论】:

      • 谢谢,这看起来很简单!
      • 那行得通吗?我期待NOT_STARTED等等。
      • 我想要一个你有一个数组或散列的选项,这样会很有用
      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2020-04-16
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2013-09-06
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多