Usando una máscara de roles para encontrar a todos los usuarios que tienen un cierto papel.
-
29-10-2019 - |
Pregunta
He estado usando un grupo de bits en un proyecto actual para hacer un seguimiento de los roles de usuario, pero ahora tiene una situación en la que necesito poder hacer un hallazgo para todos los usuarios que son un papel seguro.
Tengo la configuración de mis roles, así:
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
Puedo encontrar a todos los usuarios con el mismo mapa del mismo momento, pero no estoy seguro de cómo extraer un papel en particular, en este caso todos los usuarios que tengan los roles "Editor".
Solución
en http://railscasts.com/episodes/189--embedded-association , Ryan Bates proporciona unAlcance para buscar:
named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }
encontrarás ejemplos allí.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow