ฉันจะเขียนคำสั่งเงื่อนไขได้อย่างไรเมื่อฉันต้องการรับบันทึกทั้งหมดที่สร้างขึ้นในวันนี้
ฉันจะเขียนคำสั่งเงื่อนไขได้อย่างไรเมื่อฉันต้องการรับบันทึกทั้งหมดที่สร้างขึ้นในวันนี้
คำตอบ:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: คำตอบนี้ได้รับการแก้ไขเนื่องจากคำตอบของ Harish Shetty นั้นดีกว่าของฉัน เนื่องจากคำตอบของฉันเป็นที่ยอมรับ ฉันได้อัปเดตคำตอบนี้เพื่อรับการสนับสนุนจากชุมชน
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
มีจุดสำคัญในการดำเนินการในลักษณะที่คุณสามารถกำหนดเวลาได้ ตัวอย่างเช่นหากคุณกำลังทดสอบคุณอาจจะปรับเปลี่ยนเวลาและตัวเลือกแรกจะไม่ทำงาน คุณต้องการหลีกเลี่ยงความล้มเหลวที่อาจเกิดขึ้นในอนาคตซึ่งอาจต้องใช้เวลาในการดีบัก
ฉันรู้ว่าคำถามนี้มีคำตอบที่เป็นที่ยอมรับ วิธีแก้ปัญหาที่แนะนำในคำตอบที่ยอมรับอาจทำให้เกิดปัญหาด้านประสิทธิภาพเมื่อขนาดตารางโตขึ้น
โดยทั่วไปหากคุณทำการค้นหาตามcreated_at
คอลัมน์ให้เพิ่มดัชนีบนตารางในไฟล์การย้ายข้อมูลของคุณ
add_index :posts, :created_at
ตอนนี้ในการค้นหาระเบียนที่สร้างขึ้นในวันนี้:
ราง 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
เพื่อค้นหาโพสต์ที่สร้างขึ้นในวันใดวันหนึ่ง
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- หรือ -------------
เพิ่มวิธีการคงที่ให้กับโมเดลของคุณ
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
ราง 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- หรือ -------------
เพิ่ม named_scope ให้กับโมเดลของคุณ
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
ตัวอย่างในโพสต์นี้มีไว้สำหรับ Rails 3 เท่านั้นเนื่องจากดูเหมือนว่าจะอยู่ภายใต้หัวข้อ Rails 2 ในรางที่ 2 คุณจะต้องใช้มากกว่าnamed_scope
scope
นอกจากนี้ใน Rails 3 คุณสามารถใช้เมธอดคลาส def self.today where("created_at >= ?", Time.now.beginning_of_day) end
ซึ่งอาจจะสะอาดกว่าการใช้ขอบเขตในกรณีนี้เนื่องจากอนุญาตให้คุณละทิ้งแลมด้าได้
MySQL:
Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3
PostgreSQL:
Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3
คำตอบของ Mohit Jain เหมาะสำหรับ Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 มีตัวall_day
ช่วยที่มีประโยชน์ที่นี่
Post.where(created_at: Date.today.all_day)
หรือ
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
"เนมสโคป" นี้เป็นแอตทริบิวต์ที่มีtable_name
.
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
ดูน่าสนใจ ฉันไม่พบเอกสารใด ๆ ขอลิงค์หน่อยได้ไหม รางเลือกคอลัมน์สำหรับการเปรียบเทียบอย่างไร?
ด้วยเหตุผลบางประการไม่มีวิธีแก้ปัญหาอื่นใดในโพสต์นี้หรือวิธีอื่น ๆ ใน StackOverflow ที่ใช้ได้กับฉัน (ใช้ Rails 4.2.4 และ Ruby 2.2.3p173) นี่เป็นแบบสอบถามเดียวที่ฉันสามารถใช้กับฐานข้อมูล Postgres ของฉันได้:
Post.where("created_at >= TIMESTAMP 'now'")
เพื่อสอบถามระเบียนที่สร้างขึ้นตั้งแต่วันนี้
ใช้ขอบเขตกับ arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
จากนั้นเราสามารถใช้งานได้
today_posts = Post.created_from_today
where('created_at >= now()')
จะพบเฉพาะรายการที่ created_at ในอนาคต
.lteq(Time.zone.now.end_of_day))
ด้วย
ในราง 4.2.3 สำหรับการรับเรกคอร์ดที่สร้างขึ้นในวันนี้โดยใช้ mysql ใช้สิ่งต่อไปนี้
@usergoals = Goal.where ("userid =: userid และ Date (created_at) =: date", {userid: params [: id], date: Date.today})
ที่นี่ฉันใช้หลายเงื่อนไขหากคุณต้องการคุณสามารถแก้ไขได้สำหรับเงื่อนไขเดียว