Frage Ruby on Rails ActiveRecord Abfrage mit einem Join


Ich habe ein Benutzermodell und der Benutzer hat eine Beziehung, die has_many pets hat. Ich möchte in der Lage sein, eine ActiveRecord Abfrage zu schreiben, wo ich alle Benutzer mit einem Haustier auswählen kann, das kein Haustier hat.Name von "flauschig"

Was ist der effizienteste Weg dies mit ActiveRecord zu schreiben? Mit straight SQL würde es etwas wie das folgende aussehen:

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


21
2018-04-30 22:12


Ursprung


Antworten:


Das sollte funktionieren:

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

Vielleicht möchten Sie auch die folgender Teil (auf joins) zu den offiziellen RoR-Richtlinien.


39
2018-04-30 22:19



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

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

26
2018-03-16 14:53



Der sauberste Weg ohne SQL-Injection-Schwachstelle besteht in der Verwendung von Abfrageparametern:

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

Einige Datenbanktreiber verwenden vorbereitete Anweisungen, um den Datenbankabfrageplan erneut zu verwenden. In diesem Fall muss die Datenbank die Abfrage nicht erneut analysieren, wenn nur der Parameterwert variiert.


14
2018-02-04 21:56