Active Record - ค้นหาระเบียนที่สร้างขึ้นก่อนวันนี้


87

ฉันต้องการรับเรกคอร์ดทั้งหมดที่ฟิลด์ created_at น้อยกว่าวันนี้ (วันที่) มีอะไรที่ชอบ:

MyTable.find_by_created_at(< 2.days.ago)

คำตอบ:


171

การใช้ActiveRecordเป็นวิธีมาตรฐาน:

MyModel.where("created_at < ?", 2.days.ago)

การใช้อินเทอร์เฟซArelพื้นฐาน:

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

ใช้เลเยอร์บาง ๆทับ Arel:

MyModel.where(MyModel[:created_at] < 2.days.ago)

ใช้squeel :

MyModel.where { created_at < 2.days.ago }

ขอบคุณ!. ถ้าฉันต้องการบันทึกทั้งหมดจาก MyTable1 ซึ่งเป็นความสัมพันธ์แบบหนึ่งต่อหนึ่งกับ MyTable ในเงื่อนไขเดียวกันจะเขียนแบบสอบถามได้อย่างไร ฉันกำลังอ้างถึงบางอย่างเช่นMyTable1.where(MyTable[:created_at] < Time.now)เป็นไปได้หรือไม่?
Sayuj

ใช่ฉันได้ตั้งค่าคลาสเรกคอร์ดที่ใช้งานความสัมพันธ์แล้ว
Sayuj

12

หากต้องการรับบันทึกทั้งหมดที่MyTableสร้างขึ้นจนถึง 2 วันที่ผ่านมา:

MyTable.where(created_at: Date.new..2.days.ago)

โปรดทราบว่าคุณสามารถค้นหาเรกคอร์ดที่มีฟิลด์ที่มีฟิลด์ในอนาคตในลักษณะเดียวกันได้เช่นเพื่อรับเรกคอร์ดทั้งหมดMyTableโดยใช้event_dateเวลาอย่างน้อย 2 วันจากนี้:

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"]]
Pavel Chuchuva

3

อีกวิธีหนึ่งคือการสร้างขอบเขตในMyModelหรือในการApplicationRecordใช้อินเทอร์เฟซArelเช่นtokland sugensted ในคำตอบของเขาดังนี้:

scope :col, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

ตัวอย่างการใช้ขอบเขต:

MyModel.col(:created_at, :lt, 2.days.ago)

สำหรับการคาดการณ์ทั้งหมดโปรดตรวจสอบเอกสารประกอบหรือซอร์สโค้ดรหัสที่มาขอบเขตนี้ไม่ทำลายwhereโซ่ ซึ่งหมายความว่าคุณสามารถทำได้:

MyModel.custom_scope1.col(:created_at, :lt, 2.days.ago).col(:updated_at, :gt, 2.days.ago).custom_scope2

ความคิดที่ยอดเยี่ยม แต่ActiveRecord::Relationกำหนดวิธีการอินสแตนซ์ด้วยชื่อarelซึ่งหมายความว่าคุณต้องเลือกชื่ออื่น
M-Dahab

-35

Time.now หมายถึงตอนนี้หรือวินาทีนี้ ดังนั้นเพื่อค้นหาผู้ใช้ทั้งหมดก่อนตอนนี้ให้ใช้

@users = User.all

สิ่งนี้จะค้นหาผู้ใช้ทั้งหมดก่อนตอนนี้และจะยกเว้นผู้ใช้ในอนาคตหรือผู้ใช้ที่เข้าร่วมหลังจาก Time.now


1
เวลาตอนนี้ไม่เหมือนกับวันนี้
John Naegle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.