Булевы против Enum против флага - PullRequest
0 голосов
/ 03 октября 2011

Я работаю над сайтом, который позволяет пользователям входить в систему. У всех пользователей 1 аккаунт, в аккаунте может быть много заказов. Пользователь может быть клиентом, работником или менеджером. Клиент никогда не является ни работником, ни менеджером. менеджер тоже рабочий. Я хотел бы представить дополнительные разделы страниц / параметры навигации в зависимости от типа пользователя, вошедшего в систему.

В настоящее время я использую набор логических значений, чтобы пометить пользователя как определенный тип, проверить это значение и выполнить некоторые блоки if / elsif, чтобы сгенерировать страницу, которую видит пользователь.

class User
  include DataMapper::Resource
  # ...
  # various properties
  # ...
  property :client, Boolean
  property :worker, Boolean
  property :manager, Boolean
end

А затем я использую фильтр before для проверки типа пользователя и установки результата в качестве переменной.

before do
  @user = session[:user]
  if @user.client?
    @ura = 'client'
  elsif @user.worker?
    @ura = 'worker'
  elseif @user.manager?
    @ura = 'manager'
  end
end

Тогда, на мой взгляд, у меня есть @ura, чтобы поиграть. Мне кажется, что это уже создаст мне проблемы для менеджеров, потому что @ura должен быть и работником, и менеджером. Я мог бы использовать некоторые или в своих представлениях, но я думаю, что лучшим решением было бы установить тип пользователя как Enum или Flag. Но я не очень понимаю, как использовать это в моем процессе.

Я хотел бы знать, в чем заключаются преимущества / недостатки каждого из них, и основной пример того, как я могу получить соответствующее значение в @ ura.

1 Ответ

0 голосов
/ 03 октября 2011

Я не уверен, но может быть Массив будет лучшим решением:

class User ....
   def getRoles
      roles = Array.new
      roles << "client" if self.client? 
      roles << "manager" if self.manager? 
      roles << "worker" if self.worker? 
      roles
   end
end

before do
  @user = session[:user]
  if(@user.getRoles.index("manager") != nil)
    ...
...