2009-07-15 7 views
0

J'ai une application Rails avec les utilisateurs, et chaque utilisateur Rôles HABTM.Rails/AR trouver où habtm ne comprend pas

Je souhaite sélectionner Utilisateurs sans rôle spécifique. J'ai searchlogic à ma disposition, et je suis perdu. J'ai essayé d'utiliser une combinaison de conditions et de jointures et inclut et non quoi, mais je n'arrive pas à le clouer. Cela fonctionne:

User.find(:all, :conditions => ['role_id != ?', Role[:admin].id], :joins => :roles) 

Pour trouver des utilisateurs qui ne sont pas admins, mais ne trouve pas non utilisateurs avec aucun rôle (que je veux trouver aussi bien).

Quelle simple chose manque-t-elle dans mon état de fatigue?

Répondre

0

Que diriez-vous ceci:

User.find :all, :conditions => [ 'roles.id is ? or roles.id != ?', nil, Role[:admin].id ], :include => :roles 

Cela fonctionne pour has_many :through, semble comme il devrait être la même chose pour HABTM.

+0

Je suis assez sûr que tout trouve les utilisateurs sans rôles plutôt que sans le rôle spécifique. – Shadwell

+0

à droite, lisez la question trop vite. Merci et réparé. – austinfromboston

+0

Je crois que cela ne fonctionne que si chaque utilisateur n'a qu'un seul rôle. – clem

0

Je peux faire

User.all - User.find(:all, :conditions => ['role_id = ?', Role[:admin].id], :joins => :roles) 

qui réalise ce que je veux dans deux requêtes, ce qui est probablement très bien pour ce projet, mais si je peux l'obtenir à une seule requête ce serait bien.

2

Utilisez un sous-requête et l'opérateur NOT IN

User.find(:all,:conditions => ["id NOT IN (select user_id from roles_users where role_id = ?)", Role[:admin].id) 
+0

Cela a fait ma journée, merci! – clem

Questions connexes