prüft, ob eine Verknüpfung NICHT existiert
Ich bin auf der Suche nach dem schreiben eines Bereichs, der gibt alle Datensätze zurück, die nicht mit einem bestimmten Verein.
foo.rb
class Foo < ActiveRecord::Base
has_many :bars
end
bar.rb
class Bar < ActiveRecord::Base
belongs_to :foo
end
Möchte ich einen Bereich, finden alle Foo's
dass dont irgendwelche bars
. Es ist leicht zu finden, die diejenigen, die eine Assoziation mit joins
, aber ich habe nicht gefunden, einen Weg, um das Gegenteil zu tun.
InformationsquelleAutor der Frage Julio G Medina | 2012-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schienen 4 macht dies zu einfach 🙂
diese Ausgänge die gleiche Abfrage wie jdoe Antwort
Und als Bereich:
InformationsquelleAutor der Antwort TheCha͢mp
in foo.rb
InformationsquelleAutor der Antwort shweta
Bevorzuge ich squeel gem, komplexe Abfragen zu erstellen. Es erstreckt sich ActiveRecord mit einer solchen Magie:
baut, dass die folgende Abfrage:
So,
ist, was Sie verwenden können, um zu erstellen die geforderten Umfang.
InformationsquelleAutor der Antwort jdoe
Für Schienen 5+ (Ruby 2.4.1 & Postgres 9.6)
Habe ich 100
foos
und 9900bars
. 99 derfoos
jeweils 100bars
, und einer von Ihnen hat keine.Erzeugt eine SQL-Abfrage:
und gibt die eine
Foo
ohnebars
Die momentan akzeptierte Antwort
Foo.where.not(id: Bar.select(:foo_id).uniq)
ist nicht arbeiten. Es ist die Herstellung von zwei SQL-Abfragen:gibt alle
foos
weil allefoos
haben eineid
ist nicht null.Muss es geändert werden, um
Foo.where.not(id: Bar.pluck(:foo_id).uniq)
zu reduzieren, um eine Abfrage und finden unsereFoo
, aber es führt schlecht in benchmarksInformationsquelleAutor der Antwort m. simon borg
Verwendung NICHT BESTEHT, mit einem BEGRENZTEN Unterabfrage kann schneller sein:
Mit ActiveRecord (>= 4.0.0):
InformationsquelleAutor der Antwort Sjoerd