我有以下具有枚举(UserStatus)的ruby类(user.rd):
class User< ActiveRecord::Base
end
class UserStatus
NEW = "new"
OLD = "old"
DELETED = "deleted"
end
有没有办法可以迭代所有枚举值?
答案 0 :(得分:5)
Ruby没有“枚举”。这些是您定义的常量。 鉴于此,您可以迭代类中的常量:
#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
p el
end
答案 1 :(得分:5)
您创建的内容称为“常量”,而不是枚举。正如Zabba所说,“Ruby没有'enum'。”如果你必须保留这个数据结构,如果你已经在你的代码中使用常量,那么你可以像这样迭代它们:
UserStatus.constants(false).each do |const_name|
p [ const_name, UserStatus.const_get( const_name ) ]
end
#=> :NEW, "new"]
#=> [:OLD, "old"]
#=> [:DELETED, "deleted"]
需要使用上面的false
来防止你获得超类中定义的常量:
class Foo; A = 1; end
class Bar < Foo; B = 1; end
Bar.constants
#=> [:B, :A]
Bar.constants(false)
#=> [:B]
如果你没有使用个别常量,你可能会对创建一个不可变值的冻结哈希感兴趣:
class User < ActiveRecord::Base
STATUS = {
:new => 'new',
:old => 'old',
:deleted => 'deleted'
}
STATUS.freeze
STATUS.values.each{ |v| v.freeze }
end
bob.status = User::STATUS[:new]
User::STATUS.each do |name,string|
p [ name, string ]
end
答案 2 :(得分:2)
请注意:http://code.dblock.org/ShowPost.aspx?id=184(略微改善http://www.rubyfleebie.com/enumerations-and-ruby/)。让您写下以下内容。
class Gender
include Enum
Gender.define :MALE, "male"
Gender.define :FEMALE, "female"
end
当然
Gender.all
Gender::MALE