2012-04-30 9 views
19

Ich habe ein Benutzermodell und der Benutzer hat eine Beziehung, die has_many Haustiere hat. Ich möchte in der Lage, eine Activerecord-Abfrage zu schreiben, wo ich alle Benutzer mit einem Haustier auswählen können, die keine pet.name von „fluffy“Ruby on Rails ActiveRecord Abfrage mit einem Join

hat Was ist der effizienteste Weg, dies mit Active zu schreiben? Mit gerade SQL es etwas wie folgt aussehen würde: die following part (auf joins) auf den offiziellen RoR Richtlinien lesen möchten Sie vielleicht

User.joins(:pets).where("pets.name != 'fluffy'") 

auch:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

Antwort

37

Das sollte funktionieren.

+2

Bitte korrigieren Sie mich, wenn ich falsch liege, aber wäre es nicht 'User.joins (: pet) ...' - Singular - für den Symbolparameter? – jeffdill2

+2

@ jeffdill2 Das hängt davon ab, wie die Assoziation definiert ist. Wenn zum Beispiel der Benutzer 'has_one: pet' hätte, hättest du recht. –

+0

@MikeC ah, direkt an. – jeffdill2

14

Der sauberste Weg, ohne SQL-Injection-Schwachstelle wird mit Hilfe von Abfrageparameter:

User.joins(:pets).where("pets.name != ?", "fluffy") 

Einige Datenbanktreiber für oben vorbereitete Anweisungen verwenden Datenbank Abfrageplan wiederverwenden. In diesem Fall muss die Datenbank die Abfrage nicht erneut analysieren, wenn nur der Parameterwert variiert.

24

In Schienen 4 können Sie dies machen noch deutlicher:

User.joins(:pets).where.not(pets: { name: 'fluffy' })