usando uma máscara de funções para encontrar todos os usuários que possuem uma determinada função
-
29-10-2019 - |
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".
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