我有一些常量代表我模型的一个字段中的有效选项。在 Ruby 中处理这些常量的最佳方法是什么?
问问题
24886 次
6 回答
40
您可以为此目的使用数组或哈希(在您的 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']
于 2008-11-05T16:41:31.403 回答
11
我将它们直接放在模型类中,如下所示:
class MyClass < ActiveRecord::Base
ACTIVE_STATUS = "active"
INACTIVE_STATUS = "inactive"
PENDING_STATUS = "pending"
end
然后,当使用另一个类的模型时,我引用了常量
@model.status = MyClass::ACTIVE_STATUS
@model.save
于 2008-11-05T16:38:45.027 回答
9
如果它正在驱动模型行为,那么常量应该是模型的一部分:
class Model < ActiveRecord::Base
ONE = 1
TWO = 2
validates_inclusion_of :value, :in => [ONE, TWO]
end
这将允许您使用内置的 Rails 功能:
>> m=Model.new
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil>
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true
或者,如果您的数据库支持枚举,那么您可以使用Enum Column插件之类的东西。
于 2008-11-05T21:22:07.653 回答
8
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
请参阅其文档以获取详细说明。
于 2014-01-09T14:51:59.027 回答
5
你也可以在你的模型中使用它,就像这样:
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
于 2008-11-05T17:42:13.073 回答
0
您还可以使用模块将常量分组为主题 -
class Runner < ApplicationRecord
module RUN_TYPES
SYNC = 0
ASYNC = 1
end
end
然后有,
> Runner::RUN_TYPES::SYNC
=> 0
> Runner::RUN_TYPES::ASYNC
=> 1
于 2017-01-28T12:58:20.863 回答