2009-07-15 4 views
0

Ich habe eine Rails App mit Benutzern und jedem Benutzer HABTM Rollen.Rails/AR finden, wo hattm nicht enthalten

Ich möchte Benutzer ohne eine bestimmte Rolle auswählen. Ich habe Suchlogik zur Verfügung, und ich bin verloren. Ich habe versucht, eine Kombination von Bedingungen und verbindet und enthält und was nicht, aber ich kann nicht scheinen, es zu nageln. Dies funktioniert:

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

Benutzer zu finden, die nicht Administratoren sind, ist aber nicht, dass Benutzer ohne Rollen finden (was ich auch finden wollen).

Welche einfache Sache vermisse ich in meinem müden Zustand?

Antwort

0

Wie wäre es damit:

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

Das für has_many :through arbeitet, scheint, wie es das gleiche für HABTM sein sollte.

+0

Ich bin ziemlich sicher, dass ohne Rollen findet Benutzer nur statt, ohne die spezifische Rolle. – Shadwell

+0

richtig, lesen Sie die Frage zu schnell. Danke und repariert es. – austinfromboston

+0

Ich glaube, das funktioniert nur, wenn jeder Benutzer nur eine Rolle hat. – clem

0

kann ich

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

das, was erreicht ich in zwei Abfragen wollen, die für dieses Projekt wahrscheinlich in Ordnung ist, aber wenn ich es auf einer einzigen Abfrage zu bekommen wäre es schön.

2

Verwenden Sie eine Unterabfrage und die NICHT IN Operator

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

Das machte meinen Tag, danke! – clem