He extendido el modelo de usuario para permitirme hacer .can? controles sobre el usuario.
class User < ApplicationRecord def ability @ability = Ability.new self end delegate :can?, :cannot?, :to => :ability end Esto me permite hacer cosas como @some_user.can? :edit, Book y obtener un resultado. (El ayudante de vista cancan, pero en el modelo). Esto funciona muy bien.
Sin embargo, me gustaría poder hacer lo contrario y obtener todos los usuarios que pueden realizar una acción.
Ejemplo: Dame todos los usuarios que pueden: editar, Libros. User.can? :edit, Book que devuelve una colección de registros activa.
Para que esto funcione, hice esto;
class User < ApplicationRecord def self.can? sym, obj, *args uids = [] User.all.each do |user| uids << user.id if user.can? sym, obj, args end User.where id: uids end endSi bien esto funciona, se siente realmente asqueroso ya que itera a través de cada usuario y me preocupa la escala ... ¿hay una manera más rápida de hacer esto?
sugiero combinar cancan con rolify gem , con rolify podrías preconfigurar roles para los usuarios, entonces tu problema se convertirá en una consulta para los usuarios que tienen el edit Book role
member_user.add_role :read, Book admin_user.add_role :edit, Book # query User.with_role(:edit, Book) # [admin_user] User.without_role(:edit, Book) # [member_user]