Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rails `where` für weniger Zeit als Abfragen

Bearbeiten 2. 5.9.20

Wenn Sie Ruby 2.6 verwenden, können Sie dies mit endlosen Bereichen tun und in Ruby 2.7 können Sie Bereiche ohne Anfang verwenden.

Beispiel:

# Ruby >= 2.6
User.where(last_deposit: 10.days.ago..)

erzeugt

SELECT "users".* FROM "users" WHERE "user"."last_deposit" >= '2020-04-29 21:58:39.109419'"

und

# Ruby >= 2.7
User.where(last_deposit: ..10.days.ago)

erzeugt

SELECT "users".* FROM "users" WHERE "users"."last_deposit" <= '2020-04-29 22:01:05.582055'

Bearbeiten

Dies ist jetzt in Rails 5 möglich!

User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)

generiert die SQL

SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').

Original (und Rails <5) Antwort

Es sieht nicht so aus, als gäbe es eine Möglichkeit, grundlegende where zu verwenden Hash-Syntax zum Generieren einer Größer-als-oder-kleiner-als-Abfrage für Zeitstempel. Der einfachste und lesbarste Weg ist in meiner Frage unter Current Simple Solution beschrieben .

Eine andere Möglichkeit, dies zu tun, verwendet ARel, aber Sie müssen einige weniger häufig gesehene Anrufe tätigen. Zuerst können Sie ein Handle auf die ARel-Tabelle der AR-Klasse abrufen, auf die Spalte zugreifen und das Ergebnis von „größer als“ gt übergeben , größer oder gleich gteq , kleiner als lt , und/oder kleiner oder gleich lteq Methode mit einem Argument zu where .

In der obigen Situation würde dies wie folgt erfolgen:

last_deposit_column = User.arel_table[:last_deposit]
last_deposit_over_ten_days_ago = last_deposit_column.gteq(10.days.ago)
User.where(last_deposit_over_ten_days_ago)