Bản ghi Hoạt động - Tìm bản ghi đã được tạo_at trước ngày hôm nay


87

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:


167

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 }

cảm ơn!. Nếu tôi cần tất cả các bản ghi từ MyTable1 có quan hệ 1-1 với MyTable với cùng một điều kiện, làm thế nào để viết truy vấn? Tôi đã đề cập một cái gì đó như MyTable1.where(MyTable[:created_at] < Time.now)là nó có thể?
Sayuj

Có Tôi đã đặt lớp bản ghi hoạt động quan hệ.
Sayuj

11

Để 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)

Điều này tạo ra"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva

2

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

Ý tưởng tuyệt vời. Nhưng,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.
M-Dahab vào

-36

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


1
Time.now không giống với ngày hôm nay
John Naegle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.