如果你的模型确实对常量“负责”,你应该把它们放在那里。您可以创建类方法来访问它们,而无需创建新的对象实例:
class Card < ActiveRecord::Base
def self.colours
['white', 'blue']
end
end
# accessible like this
Card.colours
或者,您可以创建类变量和访问器。然而,不鼓励这样做,因为类变量在继承和多线程环境中可能会表现得令人惊讶。
class Card < ActiveRecord::Base
@@colours = ['white', 'blue'].freeze
cattr_reader :colours
end
# accessible the same as above
Card.colours
如果需要,上面的两个选项允许您更改每次调用访问器方法时返回的数组。如果你有一个真正不可改变的常量,你也可以在模型类上定义它:
class Card < ActiveRecord::Base
COLOURS = ['white', 'blue'].freeze
end
# accessible as
Card::COLOURS
您还可以创建可从初始化程序中的任何位置访问的全局常量,如下例所示。如果您的颜色确实是全局的并且在多个模型上下文中使用,这可能是最好的地方。
# put this into config/initializers/my_constants.rb
COLOURS = ['white', 'blue'].freeze
# accessible as a top-level constant this time
COLOURS
注意:当我们上面定义常量时,通常我们想要freeze
数组。这可以防止其他代码稍后(无意中)通过例如以下方式修改数组:添加一个新元素。一旦对象被冻结,就无法再更改。