sql >> Database >  >> RDS >> Mysql

Rails `waar` voor minder tijd dan queries

Bewerk 2 5/9/20

Als u Ruby 2.6 gebruikt, kunt u dit doen met eindeloze reeksen en in Ruby 2.7 kunt u beginloze reeksen gebruiken.

Bijv.:

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

genereert

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

en

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

genereert

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

Bewerken

Dit is nu mogelijk in Rails 5!

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

genereert de SQL

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

Origineel (en Rails <5) Antwoord

Het lijkt niet alsof er een manier is om de basis where . te gebruiken hash-syntaxis om een ​​groter dan of kleiner dan-query voor tijdstempels te genereren. De eenvoudigste en meest leesbare manier is beschreven in mijn vraag onder Current Simple Solution .

Een andere manier om dit te doen, maakt gebruik van ARel, maar u moet een aantal minder vaak voorkomende oproepen doen. Eerst kun je een handvat krijgen voor de ARel-tabel van de AR-klasse, toegang krijgen tot de kolom, het resultaat doorgeven van de groter dan gt , groter dan of gelijk aan gteq , kleiner dan lt , en/of kleiner dan of gelijk aan lteq methode met een argument voor where .

In de bovenstaande situatie zou dit als volgt worden gedaan:

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)


  1. SQL Server 2016 - Introduction to Stretch Database

  2. Hoe @@MAX_CONNECTIONS werkt in SQL Server

  3. Meerdere databaseverbindingen in Rails

  4. INSERT INTO @TABLE EXEC @query met SQL Server 2000