Chỉnh sửa 2 5/9/20
Nếu bạn đang sử dụng Ruby 2.6, bạn có thể thực hiện việc này với phạm vi vô tận và trong Ruby 2.7, bạn có thể sử dụng phạm vi bắt đầu ít hơn.
Ví dụ:
# Ruby >= 2.6
User.where(last_deposit: 10.days.ago..)
tạo ra
SELECT "users".* FROM "users" WHERE "user"."last_deposit" >= '2020-04-29 21:58:39.109419'"
và
# Ruby >= 2.7
User.where(last_deposit: ..10.days.ago)
tạo ra
SELECT "users".* FROM "users" WHERE "users"."last_deposit" <= '2020-04-29 22:01:05.582055'
Chỉnh sửa
Điều này hiện có thể thực hiện được trong Rails 5!
User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)
sẽ tạo ra SQL
SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').
Câu trả lời Original (và Rails <5)
Có vẻ như không có cách nào để sử dụng where
cú pháp băm để tạo truy vấn lớn hơn hoặc nhỏ hơn cho dấu thời gian. Cách đơn giản và dễ đọc nhất được nêu trong câu hỏi của tôi dưới Current Simple Solution
.
Một cách khác để thực hiện là sử dụng ARel nhưng bạn phải thực hiện một số cuộc gọi ít thường thấy hơn. Trước tiên, bạn có thể nhận một xử lý tới bảng ARel của lớp AR, truy cập cột, chuyển kết quả lớn hơn gt
, lớn hơn hoặc bằng gteq
, nhỏ hơn lt
và / hoặc nhỏ hơn hoặc bằng lteq
phương thức có đối số là where
.
Trong tình huống trên, điều này sẽ được thực hiện như sau:
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)