我有以下具有枚举(UserStatus)的ruby类(user.rd):
class User< ActiveRecord::Base
end
class UserStatus
NEW = "new"
OLD = "old"
DELETED = "deleted"
end
Run Code Online (Sandbox Code Playgroud)
有没有办法可以迭代所有枚举值?
Ruby没有"枚举".这些是您定义的常量.鉴于此,您可以迭代类中的常量,如下所示:
#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
p el
end
Run Code Online (Sandbox Code Playgroud)
你在那里创造的东西叫做'常数',而不是枚举.正如扎巴所说,"红宝石没有'枚举'." 如果你必须保留这个数据结构,如果你已经在代码中使用了常量,那么你可以像这样迭代它们:
UserStatus.constants(false).each do |const_name|
p [ const_name, UserStatus.const_get( const_name ) ]
end
#=> :NEW, "new"]
#=> [:OLD, "old"]
#=> [:DELETED, "deleted"]
Run Code Online (Sandbox Code Playgroud)
false需要使用上面的代码来防止你获得超类中定义的常量:
class Foo; A = 1; end
class Bar < Foo; B = 1; end
Bar.constants
#=> [:B, :A]
Bar.constants(false)
#=> [:B]
Run Code Online (Sandbox Code Playgroud)
如果您没有使用单个常量,您可能有兴趣创建一个不可变值的冻结哈希:
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
Run Code Online (Sandbox Code Playgroud)