sql >> Base de Datos >  >> RDS >> Mysql

Rails `where` por tiempo menor que consultas

Editar 2 9/5/20

Si está usando Ruby 2.6, puede hacer esto con rangos infinitos y en Ruby 2.7 puede usar rangos sin comienzo.

Por ejemplo:

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

genera

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

y

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

genera

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

Editar

¡Esto ahora es posible en Rails 5!

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

generará el SQL

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

Respuesta original (y Rails <5)

No parece que haya una manera de usar where básico sintaxis hash para generar una consulta mayor o menor que para las marcas de tiempo. La forma más simple y legible se describe en mi pregunta en Current Simple Solution .

Otra forma de hacerlo utiliza ARel, pero debe realizar algunas llamadas menos comunes. Primero, puede obtener un identificador de la tabla ARel de la clase AR, acceder a la columna, pasar el resultado de mayor que gt , mayor o igual que gteq , menor que lt , y/o menor o igual que lteq método con un argumento para where .

En la situación anterior, esto se haría así:

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)