我需要创建一个枚举,我需要从查询字符串中的值初始化。
我拥有的以及我需要做的事例:
class UserType
NONE = 0
MEMBER = 1
ADMIN = 2
SUPER = 3
end
现在我的查询字符串中有:
/users/load_by_type?type=2
现在在我的控制器中,我将从查询字符串中获取值2,然后我需要一个具有值'MEMBER'的UserType对象。
我该怎么做?
如果我的班级不是一个很好的枚举黑客,请告知。
答案 0 :(得分:3)
这样的事情怎么样。
require 'active_record'
# set up db
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
# define schema
ActiveRecord::Schema.define do
suppress_messages do
create_table :users do |t|
t.string :name
t.string :role
end
end
end
# define class
class User < ActiveRecord::Base
Roles = %w[none member admin super].map(&:freeze)
validates_inclusion_of :role, in: Roles
end
# specification
describe User do
before { User.delete_all }
let(:valid_role) { User::Roles.first }
let(:invalid_role) { valid_role.reverse }
it 'is valid if its role is in the Roles list' do
User.new.should_not be_valid
User.new(role: valid_role).should be_valid
User.new(role: invalid_role).should_not be_valid
end
let(:role) { User::Roles.first }
let(:other_role) { User::Roles.last }
it 'can find users by role' do
user_with_role = User.create! role: role
user_with_other_role = User.create! role: other_role
User.find_all_by_role(role).should == [user_with_role]
end
end
它的缺点是使用整个字符串(255个字符)作为枚举方法,但它还具有可读性和易用性的优点(它可能会以“/ users / load_by_role?role = admin”的形式出现“)。此外,如果在某些时候它的成本太高,应该很容易更新以使用一个小整数。
答案 1 :(得分:1)
我认为我宁愿使用哈希来做这种事情,但只是为了好玩:
class Foo
BAR = 1
STAN = 2
class << self
def [](digit)
constants.find { |const| const_get(const) == digit }
end
end
end
puts Foo[1] # BAR
puts Foo[2] # STAN