Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Rails `where` para tempo menor que consultas

Editar 2 09/05/20


Se você estiver usando Ruby 2.6, você pode fazer isso com intervalos infinitos e no Ruby 2.7 você pode usar intervalos sem início.

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

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

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

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

Editar


Isso agora é possível no Rails 5!
User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)

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

Original (e Rails <5) Resposta


Não parece haver uma maneira de usar o básico where sintaxe de hash para gerar uma consulta maior ou menor que para carimbos de data/hora. A maneira mais simples e legível é descrita na minha pergunta em Current Simple Solution .

Outra maneira de fazer isso é usar o ARel, mas você precisa fazer algumas chamadas menos comuns. Primeiro você pode obter um identificador para a tabela ARel da classe AR, acessar a coluna, passar o resultado do maior que gt , maior ou igual a gteq , menor que lt , e/ou menor ou igual a lteq método com um argumento para where .

Na situação acima, isso seria feito assim:
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)