如何在Rails4模型中存储符号



我经常需要存储一个常量。符号可以很好地定义常量类型,但我不知道如何在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表中有一列存储符号/常量。这可能吗?

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

您可能还想尝试Rails 4.1中新增的"enum"功能。你可以简单地声明如下

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

请注意,您需要添加一个integer类型的"status"列来支持这一点。

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

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

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

最新更新