Wie man eine NOT IN Abfrage mit ActiveRecord / Rails ausdrückt?
Einfach zu aktualisieren, da es scheint, eine Menge Leute kommen, um diese, wenn Sie mit Rails 4 Blick auf die Antworten werfen, die von Lê Trung` und VinniVidiVicci.
Topic.where.not(forum_id:@forums.map(&:id))
Topic.where(published:true).where.not(forum_id:@forums.map(&:id))
Ich hoffe es gibt eine einfache Lösung, die nicht die find_by_sql
wenn nicht, dann denke ich, die arbeiten müssen.
Fand ich dieser Artikel welche Referenzen diese:
Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })
das ist das gleiche wie
SELECT * FROM topics WHERE forum_id IN (<@forum ids>)
Frage ich mich, ob es eine Möglichkeit gibt, das zu tun NOT IN
mit, wie:
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
InformationsquelleAutor der Frage Toby Joiner | 2010-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mit diesem:
Wo
actions
ist ein array mit:[1,2,3,4,5]
Edit:
Für schiene 4-notation:
InformationsquelleAutor der Antwort José Castro
FYI, In Rails 4, können Sie
not
syntax:InformationsquelleAutor der Antwort Trung Lê
Können Sie versuchen so etwas wie:
Müssen Sie möglicherweise zu tun
@forums.map(&:id).join(',')
. Ich kann mich nicht erinnern, ob Rails wird das argument in eine CSV-Liste auf, wenn es Durchlaufen.Könnte man dies auch tun:
InformationsquelleAutor der Antwort jonnii
Verwendung Von Arel:
oder, wenn bevorzugt:
und da Schienen 4 auf:
Bitte beachten Sie, dass letztendlich Sie nicht möchten, dass die forum_ids werden die ids-Liste, sondern eher eine Unterabfrage, wenn dem so ist, dann sollten Sie so etwas tun, bevor man die Themen:
in dieser Art bekommen Sie alles in eine einzelne Abfrage: sowas wie:
Auch feststellen, dass irgendwann Sie nicht wollen, zu tun -, sondern eine Mitmach -, was möglicherweise effizienter ist.
InformationsquelleAutor der Antwort Pedro Morte Rolo
Erweitern @Lê Trung Antwort, in Rails 4 können Sie Folgendes tun:
Und Sie könnten es einen Schritt weiter.
Wenn Sie brauchen, um den ersten filter nur für veröffentlichte Themen und dann filtern die ids, die Sie nicht wollen, Sie könnten dies tun:
Schienen 4 macht es so viel einfacher!
InformationsquelleAutor der Antwort VinniVidiVicci
Akzeptierten Lösung schlägt fehl, wenn
@forums
leer ist. Zur Umgehung dieses ich zu tun hatteOder, wenn Sie mit Rails 3+:
InformationsquelleAutor der Antwort Filipe Giusti
Meisten Antworten oben reichen sollten, Sie aber, wenn Sie tun, viel mehr von solchen Prädikat und komplexe Kombinationen check-out Squeel. Sie werden in der Lage sein, so etwas zu tun wie:
InformationsquelleAutor der Antwort jake
Haben möchten Sie vielleicht einen Blick auf die meta_where plugin von Ernie Miller. Ihre SQL-Anweisung:
...könnte das so Ausdrücken:
Ryan Bates von Railscasts erstellt eine schönen screencast zu erklären, MetaWhere.
Nicht sicher, ob dies ist, was du suchst, aber in meinen Augen ist es sicherlich besser aussieht als ein embedded SQL-Abfrage.
InformationsquelleAutor der Antwort Marcin Wyszynski
Kann diese forum-ids gearbeitet werden, in einer pragmatischen Art und Weise? z.B. finden Sie diese Foren irgendwie - wenn das der Fall ist, sollten Sie etwas tun, wie
Wäre effizienter, als wenn eine SQL -
not in
InformationsquelleAutor der Antwort Omar Qureshi
Diese Weise optimiert für die Lesbarkeit, aber es ist nicht so effizient in Bezug auf die Datenbank-Abfragen:
InformationsquelleAutor der Antwort evanrmurphy
Den ursprünglichen post explizit erwähnt über numerische IDs, aber ich kam hier auf der Suche nach der syntax für eine NICHT IN mit ein array von strings.
ActiveRecord verarbeitet, schön auch für dich:
InformationsquelleAutor der Antwort Andy Triggs
Können Sie sql in Ihre Bedingungen:
InformationsquelleAutor der Antwort tjeden
Huckepack-off von " jonnii:
mit zupfen eher als Zuordnung über die Elemente
gefunden über railsconf 2012 10 Dinge die Sie nicht kennen, Schienen tun könnte
InformationsquelleAutor der Antwort Thomas Wolfe
Wenn Sie die Abfrage ein leeres array-add "<< 0", um das array in der where-block, damit er nicht wieder von "NULL" und brechen Sie die Abfrage.
Wenn Maßnahmen könnten sein: eine leere oder leere array.
InformationsquelleAutor der Antwort itsEconomics
Hier ist eine komplexere "nicht in" - Abfrage mit einer Unterabfrage in rails 4 mit squeel. Natürlich sehr langsam im Vergleich zu gleichwertigen sql, aber hey, es funktioniert.
Den ersten 2 Methoden in Umfang, sind andere Bereiche, die erklären, die Aliase cavtl1 und tl1. << ist der nicht-operator in squeel.
Hoffe, das jemand hilft.
InformationsquelleAutor der Antwort dukha