Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rails "où" pour un temps inférieur à celui des requêtes

Modifier 2 09/05/2020

Si vous utilisez Ruby 2.6, vous pouvez le faire avec des plages infinies et dans Ruby 2.7, vous pouvez utiliser des plages sans début.

Ex. :

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

génère

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

et

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

génère

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

Modifier

C'est désormais possible dans Rails 5 !

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

va générer le SQL

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

Réponse originale (et Rails <5)

Il ne semble pas qu'il existe un moyen d'utiliser where de base syntaxe de hachage pour générer une requête supérieure ou inférieure à pour les horodatages. La manière la plus simple et la plus lisible est décrite dans ma question sous Current Simple Solution .

Une autre façon de le faire utilise ARel, mais vous devez effectuer des appels moins courants. Vous pouvez d'abord obtenir un handle vers la table ARel de la classe AR, accéder à la colonne, transmettre le résultat supérieur à gt , supérieur ou égal à gteq , moins de lt , et/ou inférieur ou égal à lteq méthode avec un argument pour where .

Dans la situation ci-dessus, cela se ferait comme :

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)