Utiliser un masque de rôles pour trouver tous les utilisateurs qui ont un certain rôle
-
29-10-2019 - |
Question
J'utilise un massacre dans un projet actuel pour garder une trace des rôles utilisateur, mais j'ai maintenant une situation où je dois être en mesure de faire une recherche pour tous les utilisateurs qui sont un certain rôle.
J'ai mes rôles configurés comme tel:
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
Je peux trouver tous les utilisateurs avec exactement la même carte de bits, mais je ne sais pas comment extraire un rôle particulier, dans ce cas tous les utilisateurs qui ont les rôles "éditeur".
La solution
Sur http://railscasts.com/episodes/189-embedded-association, Ryan Bates fournit une portée à la recherche:
named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }
Vous y trouverez des exemples.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow