Ich versuche, alle Benutzer mit einer ID größer als 200 zu finden, habe jedoch Probleme mit der spezifischen Syntax.
User.where(:id > 200)
und
User.where("? > 200", :id)
haben beide versagt.
Irgendwelche Vorschläge?
ruby-on-rails
syntax
where
Adam Templeton
quelle
quelle
?
, anstatt die zu inlinieren200
?Ich habe dies nur in Rails 4 getestet, aber es gibt eine interessante Möglichkeit, einen Bereich mit einem
where
Hash zu verwenden, um dieses Verhalten zu erhalten.generiert die SQL
Das gleiche kann für weniger als mit gemacht werden
-Float::INFINITY
.Ich habe gerade eine ähnliche Frage mit Daten hier auf SO gestellt .
>=
vs.>
Um zu vermeiden, dass die Leute die Kommentare durchgehen und den Kommentaren folgen müssen, sind hier die Highlights.
Die oben beschriebene Methode nur erzeugt eine
>=
Abfrage und nicht ein>
. Es gibt viele Möglichkeiten, mit dieser Alternative umzugehen.Für diskrete Zahlen
Sie können eine
number_you_want + 1
Strategie wie oben verwenden, bei der ich an Benutzern interessiert bin, dieid > 200
aber tatsächlich suchenid >= 201
. Dies ist in Ordnung für Ganzzahlen und Zahlen, bei denen Sie um eine einzelne interessierende Einheit erhöhen können.Wenn Sie die Zahl in eine gut benannte Konstante extrahieren lassen, ist dies möglicherweise auf einen Blick am einfachsten zu lesen und zu verstehen.
Invertierte Logik
Wir können die Tatsache nutzen, dass
x > y == !(x <= y)
und die wo nicht Kette verwenden.das generiert die SQL
Das Lesen und Begründen dauert eine zusätzliche Sekunde, funktioniert jedoch für nicht diskrete Werte oder Spalten, bei denen Sie die
+ 1
Strategie nicht verwenden können .Arel Tisch
Wenn Sie Lust haben, können Sie die nutzen
Arel::Table
.generiert die SQL
Die Einzelheiten sind wie folgt:
Mit diesem Ansatz erhalten Sie genau das SQL, an dem Sie interessiert sind. Allerdings verwenden nicht viele Benutzer die Arel-Tabelle direkt und können sie als unübersichtlich und / oder verwirrend empfinden. Sie und Ihr Team wissen, was für Sie am besten ist.
Bonus
Ab Rails 5 können Sie dies auch mit Daten tun!
generiert die SQL
Doppelter Bonus
Sobald Ruby 2.6 veröffentlicht ist (25. Dezember 2018), können Sie die neue Syntax für unendliche Bereiche verwenden! Stattdessen können
201..Float::INFINITY
Sie einfach schreiben201..
. Weitere Infos in diesem Blogbeitrag .quelle
where
Matchern tun können . Denn>
ich schlage vor, der>= (number_you_want + 1)
Einfachheit halber ein zu verwenden. Wenn Sie wirklich sicherstellen möchten, dass es sich nur um eine>
Abfrage handelt, können Sie auf die ARel-Tabelle zugreifen. Jede Klasse, die von erbt,ActiveRecord
verfügt über einearel_table
Getter-Methode, die dieArel::Table
für diese Klasse zurückgibt . Auf Spalten in der Tabelle wird mit der[]
Methode like zugegriffenUser.arel_table[:id]
. Dies gibt eine zurück, dieArel::Attributes::Attribute
Sie anrufengt
und weitergeben können200
. Dies kann dann an übergeben werdenwhere
. zBUser.where(User.arel_table[:id].gt(200))
.User.where(created_at: 3.days.ago..DateTime::Infinity.new)
.WHERE (users.created_at >= '2016-04-09 14:31:15' AND users.created_at < #<Date::Infinity:0x00>)
(Back Ticks um Tabellen- und Spaltennamen, die für die SO-Kommentarformatierung weggelassen wurden).Eine bessere Verwendung besteht darin, einen Bereich im Benutzermodell zu erstellen
where(arel_table[:id].gt(id))
quelle
Wenn Sie intuitiver schreiben möchten, gibt es einen Edelstein namens Squeel , mit dem Sie Ihre Anweisungen wie folgt schreiben können:
Beachten Sie, dass die 'Klammer'-Zeichen {}
id
nur ein Text sind.Alles, was Sie tun müssen, ist, Ihrem Gemfile Squeel hinzuzufügen:
Dies kann Ihr Leben beim Schreiben komplexer SQL-Anweisungen in Ruby erheblich erleichtern.
quelle
Arel ist dein Freund.
quelle
Eine andere ausgefallene Möglichkeit ist ...
Mit dieser Funktion können Sie verständlichere Abfragen erstellen, wenn Sie diese an mehreren Stellen ersetzen möchten, z.
Dies hat mehr Bedeutung als viel
?
auf der Abfrage zu haben ...quelle
Ich habe oft dieses Problem mit Datumsfeldern (wo Vergleichsoperatoren sehr häufig sind).
Die Antwort von Mihai näher zu erläutern, die ich für einen soliden Ansatz halte.
Zu den Modellen können Sie folgende Bereiche hinzufügen:
... und dann in Ihrem Controller oder wo immer Sie Ihr Modell verwenden:
... ein komplexeres Beispiel mit Joins sieht folgendermaßen aus:
Ein großer Vorteil dieses Ansatzes besteht darin, dass (a) Sie Ihre Abfragen aus verschiedenen Bereichen zusammenstellen können und (b) Alias-Kollisionen vermieden werden, wenn Sie zweimal derselben Tabelle beitreten, da arel_table diesen Teil der Abfragegenerierung verarbeitet.
quelle
Schienen 6.1+
Rails 6.1 hat eine neue 'Syntax' für Vergleichsoperatoren unter
where
Bedingungen hinzugefügt , zum Beispiel:So kann Ihre Anfrage wie folgt umgeschrieben werden:
Hier ist ein Link zu PR, wo Sie weitere Beispiele finden.
quelle
Kürzere:
quelle
where("id > ?", 200)
Syntax) vermeiden möchte . Das erreicht das nicht.