Как создать перечисление ruby ​​и проанализировать значение из строки запроса? - PullRequest
0 голосов
/ 13 февраля 2012

Мне нужно создать перечисление, которое мне нужно будет инициализировать из значения из строки запроса.

Пример того, что у меня есть и что мне нужно сделать:

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

Сейчасв моей строке запроса у меня будет:

/users/load_by_type?type=2

Теперь в моем контроллере я получу значение 2 из строки запроса, затем мне потребуется объект UserType со значением 'MEMBER'.

Как я могу это сделать?

Если мой класс не очень хороший взлом для перечисления, пожалуйста, сообщите.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Как на счет этого.

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 голос
/ 13 февраля 2012

Я думаю, что я бы предпочел использовать хэши для такого рода вещей, но просто для удовольствия:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...