2009-07-30 6 views
0

J'ai une table avec les employés (id, nom, rôle) et un patron de table de relations (employee_id, superior_id, les deux foreign_keys à employees.id aux employés).Limiter les résultats d'un enregistrement actif find

Maintenant, si un employé se connecte, je veux seulement montrer à ses employés; un administrateur (role = admin) peut voir tous les employés.

Pour l'administrateur, il est facile:

Employee.find(:all) #to list them 
Employee.find(params[:id] #to find one 

est-il un moyen facile de limiter les résultats sur seulement mes employés?

Comme toujours ajouter une condition

where employees.id in 
(select id from bosses where superior_id = #{User.current_user.employee}) 

si le rôle est pas administrateur.

Commentaire supplémentaire

Pouvez-vous penser à une solution plus générale, où chaque fois qu'un appel à la méthode de trouver dans le dossier actif, il vérifie current_user et renvoie uniquement les éléments, il/elle doit voir?

Répondre

2

Peut-être:

Employee.all(:joins => :bosses, :conditions => {:superior_id => User.current_user.employee}) 
+0

oui, cela résout, au moins une fois, mais en fait je suis toujours à la recherche d'une solution plus générale. Comme chaque fois que j'appelle une trouvaille, cela limite l'utilisateur sur les personnes auxquelles il a accès. – Beffa

+1

peut-être des portées nommées, http://railscasts.com/episodes/108-named-scope –

+0

Vous m'avez montré le bon chemin. J'ai utilisé le code de la portée nommée, pour écrire une portée pour moi-même – Beffa

0

Vous pouvez faire quelque chose comme

@boss = Boss.find(params[:id], :include => [:employees]) 

Pour chercher un patron et ses employés. Ensuite, utilisez

@boss.employees 

pour obtenir les employés de ce boss.

Questions connexes