Pergunta

Tenho usado uma máscara de bits em um projeto atual para controlar as funções dos usuários, mas agora tenho uma situação em que preciso encontrar todos os usuários que tenham uma determinada função.

Eu tenho minhas funções configuradas assim:

  ROLES = %w[admin editor moderator contributor]

  def roles
    ROLES.reject do |r|
      ((roles_mask || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def role_symbols
    roles.map(&:to_sym)
  end

Posso encontrar todos os usuários com exatamente o mesmo mapa de bits, mas não tenho certeza de como extrair uma função específica, neste caso todos os usuários que possuem as funções de "editor".

Foi útil?

Solução

Sobre http://railscasts.com/episodes/189-embedded-association, Ryan Bates fornece um escopo para pesquisar:

named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }

Você encontrará exemplos lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top