我有一些常量代表我的一个模型字段中的有效选项.在Ruby中处理这些常量的最佳方法是什么?
您可以为此目的使用数组或哈希(在environment.rb中):
OPTIONS = ['one', 'two', 'three'] OPTIONS = {:one => 1, :two => 2, :three => 3}
或者是枚举类,它允许您枚举常量以及用于关联它们的键:
class Enumeration def Enumeration.add_item(key,value) @hash ||= {} @hash[key]=value end def Enumeration.const_missing(key) @hash[key] end def Enumeration.each @hash.each {|key,value| yield(key,value)} end def Enumeration.values @hash.values || [] end def Enumeration.keys @hash.keys || [] end def Enumeration.[](key) @hash[key] end end
你可以从中得到:
class Values < Enumeration self.add_item(:RED, '#f00') self.add_item(:GREEN, '#0f0') self.add_item(:BLUE, '#00f') end
并使用这样的:
Values::RED => '#f00' Values::GREEN => '#0f0' Values::BLUE => '#00f' Values.keys => [:RED, :GREEN, :BLUE] Values.values => ['#f00', '#0f0', '#00f']
我把它们直接放在模型类中,如下所示:
class MyClass < ActiveRecord::Base ACTIVE_STATUS = "active" INACTIVE_STATUS = "inactive" PENDING_STATUS = "pending" end
然后,当使用来自另一个类的模型时,我引用了常量
@model.status = MyClass::ACTIVE_STATUS @model.save
如果它是驱动模型行为,那么常量应该是模型的一部分:
class Model < ActiveRecord::Base ONE = 1 TWO = 2 validates_inclusion_of :value, :in => [ONE, TWO] end
这将允许您使用内置的Rails功能:
>> m=Model.new => #>> m.valid? => false >> m.value = 1 => 1 >> m.valid? => true
或者,如果您的数据库支持枚举,那么您可以使用Enum Column插件之类的东西.
Rails 4.1增加了对ActiveRecord枚举的支持.
声明一个枚举属性,其中值映射到数据库中的整数,但可以按名称查询.
class Conversation < ActiveRecord::Base enum status: [ :active, :archived ] end conversation.archived! conversation.active? # => false conversation.status # => "archived" Conversation.archived # => Relation for all archived Conversations
有关详细的说明,请参阅其文档.
您也可以在模型中使用它,如下所示:
class MyModel SOME_ATTR_OPTIONS = { :first_option => 1, :second_option => 2, :third_option => 3 } end
并像这样使用它:
if x == MyModel::SOME_ATTR_OPTIONS[:first_option] do this end