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 MyTablevớ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 MyModelhoặc ApplicationRecordbằ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ỡ wherechuỗ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 arelcó 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ể?