Tôi muốn lấy tất cả các bản ghi trong đó trường create_at ít hơn hôm nay (một ngày). Có bất cứ điều gì như:
MyTable.find_by_created_at(< 2.days.ago)
Câu trả lời:
Sử dụng ActiveRecord theo cách tiêu chuẩn:
MyModel.where("created_at < ?", 2.days.ago)
Sử dụng giao diện Arel bên dưới :
MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))
Sử dụng một lớp mỏng trên Arel:
MyModel.where(MyModel[:created_at] < 2.days.ago)
Sử dụng tiếng kêu :
MyModel.where { created_at < 2.days.ago }
Để nhận tất cả các bản ghi MyTable
đã tạo cho đến 2 ngày trước:
MyTable.where(created_at: Date.new..2.days.ago)
Lưu ý rằng bạn cũng có thể tìm kiếm hồ sơ với các lĩnh vực có chứa các lĩnh vực trong tương lai theo cách tương tự, tức là để có được tất cả hồ sơ của MyTable
với event_date
ít nhất 2 ngày từ bây giờ:
MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Một cách khác là tạo phạm vi trong MyModel
hoặc ApplicationRecord
bằng cách sử dụng giao diện Arel như tokland đã nêu trong câu trả lời của anh ấy như vậy:
scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Ví dụ về cách sử dụng phạm vi:
MyModel.arel(:created_at, :lt, 2.days.ago)
Đối với tất cả các dự đoán, hãy kiểm tra tài liệu hoặc mã nguồn . Phạm vi này không phá vỡ where
chuỗi. Điều này có nghĩa là bạn cũng có thể làm:
MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
ActiveRecord::Relation
xác định một phương thức thể hiện với tên arel
có nghĩa là bạn chỉ cần chọn một tên khác.
Time.now đề cập đến ngay bây giờ hoặc ngay giây phút này. Vì vậy, để tìm tất cả người dùng trước đây ngay bây giờ, chỉ cần sử dụng
@users = User.all
Điều này sẽ tìm thấy tất cả người dùng trước đó ngay bây giờ và sẽ loại trừ người dùng trong tương lai hoặc người dùng tham gia sau Time.now
MyTable1.where(MyTable[:created_at] < Time.now)
là nó có thể?