Edytuj 2 5/9/20
Jeśli używasz Rubiego 2.6, możesz to zrobić z nieskończonymi zakresami, aw Ruby 2.7 możesz używać zakresów bez początku.
Np.:
# Ruby >= 2.6
User.where(last_deposit: 10.days.ago..)
generuje
SELECT "users".* FROM "users" WHERE "user"."last_deposit" >= '2020-04-29 21:58:39.109419'"
i
# Ruby >= 2.7
User.where(last_deposit: ..10.days.ago)
generuje
SELECT "users".* FROM "users" WHERE "users"."last_deposit" <= '2020-04-29 22:01:05.582055'
Edytuj
Jest to teraz możliwe w Rails 5!
User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)
wygeneruje SQL
SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').
Oryginalna (i Rails <5) odpowiedź
Nie wygląda na to, że istnieje sposób na użycie podstawowego where
składnia skrótu do generowania zapytania o wartości większe lub mniejsze niż dla znaczników czasu. Najprostszy i najbardziej czytelny sposób jest opisany w moim pytaniu w sekcji Current Simple Solution
.
Innym sposobem na to jest użycie ARel, ale musisz wykonać kilka rzadziej spotykanych połączeń. Najpierw możesz uzyskać uchwyt do tabeli ARel klasy AR, uzyskać dostęp do kolumny, przekazać wynik większej niż gt
, większe lub równe gteq
, mniej niż lt
i/lub mniejsze lub równe lteq
metoda z argumentem do where
.
W powyższej sytuacji byłoby to zrobione tak:
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)