我经常需要存储常量。符号适用于定义常量类型,但我不知道如何在Rails模型中定义它们。我会创建一个单独的模型来存储类型。例如,我的Game
模型具有status
属性。
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
表中有一个存储符号/常量的列。这可能吗?
答案 0 :(得分:2)
您的游戏状态可以被视为枚举类型。我非常喜欢将这些记录存储在单独的数据库表中。它使重命名和迁移变得容易,同时保持数据完整性。
您可能还想尝试Rails 4.1新增的“枚举”功能。你可以简单地声明类似下面的内容
class Game
enum :status => %w[Init Pause Play End]
end
请注意,您需要添加一个integer类型的“status”列来支持此功能。
更多尝试阅读 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
答案 1 :(得分:1)
我会创建一组常量来表示可能的状态范围。这些将作为int存储在数据库中。这些整数可以与Game :: Over进行比较,例如在代码中。
class Game
NotStarted = 0
InPlay = 1
Over = 2
...
end
puts "let's get started!" if Game.find(id).status == Game::NotStarted