Ich benutze Rails3, ActiveRecord
Ich frage mich nur, wie ich die Bereiche mit ODER-Anweisungen anstatt mit UND verketten kann.
z.B
Person.where(:name => "John").where(:lastname => "Smith")
Das gibt normalerweise zurück:
name = 'John' AND lastname = 'Smith'
aber ich möchte:
`name = 'John' OR lastname = 'Smith'
Antworten:
Du würdest
Derzeit gibt es keine andere ODER-Unterstützung durch die neue AR3-Syntax (dh ohne Verwendung eines Edelsteins eines Drittanbieters).
quelle
.or
eingebaut .Gemäß dieser Pull-Anforderung unterstützt Rails 5 jetzt die folgende Syntax zum Verketten von Abfragen:
Es gibt auch einen Backport der Funktionalität in Rails 4.2 über dieses Juwel.
quelle
Verwenden Sie ARel
quelle
Veröffentlichen Sie einfach die Array-Syntax für dieselbe Spalte ODER Abfragen, um einen besseren Überblick zu erhalten.
quelle
Update für Rails4
erfordert keine Edelsteine von Drittanbietern
Alte Antwort
erfordert keine Edelsteine von Drittanbietern
quelle
or
oder andere Operatoren innerhalb eines Textblocks, von denen keiner im OP-Code wiedergegeben ist....where_values.join(' OR ')
meinem Fall verwendet.tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }
Teil weglassen, wenn Ihre Bereiche keine Variablen enthalten, die gebunden werden müssen.Sie können MetaWhere gem auch verwenden , um Ihren Code nicht mit SQL- Inhalten zu verwechseln:
quelle
Falls jemand nach einer aktualisierten Antwort auf diese Frage sucht, scheint eine Pull-Anfrage vorhanden zu sein, um diese in Rails zu übertragen: https://github.com/rails/rails/pull/9052 .
Dank des Affen-Patches von @ j-mcnally für ActiveRecord ( https://gist.github.com/j-mcnally/250eaaceef234dd8971b ) können Sie Folgendes tun:
Noch wertvoller ist die Fähigkeit, Zielfernrohre zu verketten mit
OR
:Dann finden Sie alle Personen mit Vor- oder Nachnamen oder deren Eltern mit Nachnamen
Nicht das beste Beispiel dafür, sondern nur der Versuch, es mit der Frage in Einklang zu bringen.
quelle
.or
Kettenfunktionalität vorgesehen. Ich konnte den Affen-Patch verwenden, den ich auf Rails> = 3.2 erwähnt habe. Möglicherweise möchten Sie jedoch warten, bis Rails 5 langjährige Änderungen an Ihrem Code vorgenommen hat.Bei mir (Rails 4.2.5) funktioniert das nur so:
quelle
Dies wäre ein guter Kandidat für MetaWhere, wenn Sie Rails 3.0+ verwenden, aber es funktioniert nicht auf Rails 3.1. Vielleicht möchten Sie stattdessen Squeel ausprobieren . Es ist vom selben Autor gemacht. So würden Sie eine OP-basierte Kette durchführen:
Sie können UND / ODER unter vielen anderen fantastischen Dingen kombinieren .
quelle
Eine aktualisierte Version von Rails / ActiveRecord unterstützt diese Syntax möglicherweise nativ. Es würde ähnlich aussehen wie:
Wie in dieser Pull-Anfrage angegeben, https://github.com/rails/rails/pull/9052
Im Moment funktioniert es großartig, einfach bei Folgendem zu bleiben:
quelle
Foo.where(foo: 'bar1').or.where(bar: 'bar2')
funktioniert nicht. Es sollte Foo.where (foo: 'bar1') oder orwhere (Foo.where (bar: 'bar2')) seinSchienen 4 + Umfang + Arel
Ich habe versucht, benannte Bereiche mit .oder und ohne Glück zu verketten, aber dies hat dazu beigetragen, mit diesen Booleschen Werten etwas zu finden. Erzeugt SQL wie
quelle
Schienen 4
quelle
Wenn Sie einen Bereich bereitstellen möchten (anstatt explizit am gesamten Datensatz zu arbeiten), sollten Sie Folgendes mit Rails 5 tun:
Oder:
quelle
Wenn Sie die where-Klausel nicht manuell ausschreiben können, um die Anweisung "oder" einzuschließen (dh Sie möchten zwei Bereiche kombinieren), können Sie union verwenden:
(Quelle: ActiveRecord Query Union )
Dadurch werden alle Datensätze zurückgegeben, die mit einer der beiden Abfragen übereinstimmen. Dies gibt jedoch ein Array zurück, kein Arel. Wenn Sie wirklich ein Arel zurückgeben möchten, überprüfen Sie diese Liste: https://gist.github.com/j-mcnally/250eaaceef234dd8971b .
Dies wird den Job erledigen, solange es Ihnen nichts ausmacht, Affen-Patching-Schienen zu verwenden.
quelle
Siehe auch diese verwandten Fragen: hier , hier und hier
Für Schienen 4, basierend auf diesem Artikel und dieser Originalantwort
Beachten Sie die Vorsicht des Artikels am Ende:
quelle
Dies ist eine sehr bequeme Methode und funktioniert in Rails 5 einwandfrei:
quelle
Der
squeel
Edelstein bietet eine unglaublich einfache Möglichkeit, dies zu erreichen (zuvor habe ich so etwas wie die Methode von @ coloradoblue verwendet):quelle
Die Antwort auf die ursprüngliche Frage: Können Sie Bereiche mit 'oder' anstelle von 'verbinden und' scheint 'nein, Sie können nicht' zu sein. Sie können jedoch einen völlig anderen Bereich oder eine andere Abfrage codieren, die den Job ausführt, oder ein anderes Framework als ActiveRecord verwenden, z. B. MetaWhere oder Squeel. In meinem Fall nicht nützlich
Ich verwende einen von pg_search generierten Bereich, der etwas mehr als nur auswählen kann. Er enthält die Reihenfolge von ASC, wodurch eine saubere Union durcheinander gebracht wird. Ich möchte es mit einem handgefertigten Bereich 'oder' machen, der Dinge tut, die ich in pg_search nicht tun kann. Also musste ich es so machen.
Dh die Bereiche in SQL umwandeln, Klammern um jeden setzen, sie zusammenfügen und dann find_by_sql mit dem generierten SQL finden. Es ist ein bisschen Müll, aber es funktioniert.
Nein, sag mir nicht, dass ich "gegen: [: name ,: code]" in pg_search verwenden kann. Ich würde es gerne so machen, aber das Feld 'name' ist ein Hstore, den pg_search nicht verarbeiten kann noch. Daher muss der Gültigkeitsbereich nach Namen handgefertigt und dann mit dem Gültigkeitsbereich pg_search verknüpft werden.
quelle
quelle