2012-04-09 4 views

Antwort

2
User.where("room_id not in (select id from rooms)") 

aber Sie dies wollen, da es eher schneller sein würde:

User.where("not exist (select id from rooms where id=users.room_id)") 

, das ist das nächste, was du bekommen kannst. Es scheint keine Möglichkeit zu geben, eine Active Record-Abfrage zu erstellen, die in SQL NOT() übersetzt wird. Eine Suche nach dem Thema gibt eine Menge von SO-Fragen mit fast der gleichen Antwort zurück.

Man könnte so etwas wie

User.all.select { |u| !Room.find_by_id(u.room_id) } 

tun aber, dass weniger effizient wieder sein könnte.

+0

"User.all" auf einem nicht-trivialen Datensatz aufrufen ist extrem gefährlich und sollte nicht einmal als Lösung vorgeschlagen werden. – tadman

3

Sie können es übersetzen fast wörtlich:

User.where('room_id not in (select id from rooms)').all 

Die where Klausel in recht flexibel ist, was sie akzeptiert.

0

Ich weiß nicht, ob Sie mit dem squeel Edelstein vertraut sind. Es ermöglicht Ihnen, sehr komplexe SQL-Abfragen in einem reinen Ruby-Code zu erstellen. In Ihrem Fall sollte es so einfach wie den folgenden Code sein (afer Hinzufügen der gem 'squeel' Linie in Ihrem Gemfile und läuft bundle install):

room_ids = Room.select{id}; User.where{room_id.not_in room_ids} 

Worth versucht, ist es nicht?

Hier ist die squeel's page.

Verwandte Themen