Mysql
 sql >> Database >  >> RDS >> Mysql

Rails `where` per un tempo inferiore alle query

Modifica 2 9/5/20

Se stai usando Ruby 2.6 puoi farlo con intervalli infiniti e in Ruby 2.7 puoi usare intervalli senza inizio.

Es.:

# 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'"

e

# 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'

Modifica

Questo è ora possibile in Rails 5!

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

genererà l'SQL

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

Risposta originale (e Rails <5)

Non sembra che ci sia un modo per usare where di base sintassi hash per generare una query maggiore o minore di per i timestamp. Il modo più semplice e leggibile è delineato nella mia domanda in Current Simple Solution .

Un altro modo per farlo utilizza ARel ma devi effettuare alcune chiamate meno comuni. Per prima cosa puoi ottenere un handle alla tabella ARel della classe AR, accedere alla colonna, passare il risultato del maggiore di gt , maggiore o uguale a gteq , inferiore a lt , e/o minore o uguale a lteq metodo con un argomento in where .

Nella situazione sopra questo sarebbe fatto come:

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)