如何创建ruby枚举并解析查询字符串中的值?

时间:2012-02-13 03:26:00

标签: ruby-on-rails ruby

我需要创建一个枚举,我需要从查询字符串中的值初始化。

我拥有的以及我需要做的事例:

class UserType
   NONE = 0
   MEMBER = 1
   ADMIN = 2
   SUPER = 3
end

现在我的查询字符串中有:

/users/load_by_type?type=2

现在在我的控制器中,我将从查询字符串中获取值2,然后我需要一个具有值'MEMBER'的UserType对象。

我该怎么做?

如果我的班级不是一个很好的枚举黑客,请告知。

2 个答案:

答案 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