Tôi nên viết câu lệnh điều kiện như thế nào khi tôi muốn lấy tất cả các bản ghi đã được tạo ngày hôm nay?
Tôi nên viết câu lệnh điều kiện như thế nào khi tôi muốn lấy tất cả các bản ghi đã được tạo ngày hôm nay?
Câu trả lời:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Tái bút: Câu trả lời này đã được sửa đổi vì câu trả lời của Harish Shetty tốt hơn câu trả lời của tôi. Như câu trả lời của tôi được chấp nhận một. Tôi đã cập nhật câu trả lời này để hỗ trợ cộng đồng
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
rất thông minh, tôi sẽ xác nhận Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Có một điểm để làm theo cách bạn có thể điều khiển thời gian. Ví dụ: nếu bạn đang thử nghiệm, bạn có thể sẽ thao túng thời gian và sau đó tùy chọn đầu tiên sẽ không hoạt động. Bạn muốn tránh loại lỗi có thể xảy ra trong tương lai mà có thể sẽ mất một thời gian gỡ lỗi.
Tôi biết câu hỏi này có một câu trả lời được chấp nhận. Giải pháp được đề xuất trong câu trả lời được chấp nhận có thể gây ra các vấn đề về hiệu suất khi kích thước bảng tăng lên.
Thông thường, nếu bạn thực hiện tra cứu dựa trên created_at
cột, hãy thêm chỉ mục trên bảng trong tệp di chuyển của bạn.
add_index :posts, :created_at
Bây giờ, để tra cứu các bản ghi được tạo ngày hôm nay:
Đường ray 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Để tra cứu các bài viết được tạo vào một ngày cụ thể.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- HOẶC -------------
Thêm một phương thức tĩnh vào mô hình của bạn
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Đường ray 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- HOẶC -------------
Thêm tên_mặt kính vào mô hình của bạn
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
ví dụ trong bài đăng này chỉ dành cho Rails 3, vì có vẻ như nó nằm dưới tiêu đề Rails 2. Trong Rails 2, bạn sẽ cần sử dụng named_scope
hơn là scope
. Ngoài ra, trong Rails 3, bạn có thể tương tự sử dụng một phương thức lớp def self.today where("created_at >= ?", Time.now.beginning_of_day) end
có thể rõ ràng hơn so với sử dụng phạm vi trong trường hợp này, vì nó cho phép bạn bỏ qua lambda.
Câu trả lời của Mohit Jain được điều chỉnh cho Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 có một trình all_day
trợ giúp hữu ích ở đây.
Post.where(created_at: Date.today.all_day)
hoặc là
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)
Điều này "phân tích tên" thuộc tính với 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
vẻ thú vị. Tôi không tìm thấy bất kỳ tài liệu nào cho nó. Bạn có thể cung cấp một số liên kết? Làm thế nào để ray chọn cột để so sánh?
Vì một số lý do, không có giải pháp nào khác trong bài đăng này cũng như các giải pháp khác trên StackOverflow phù hợp với tôi (sử dụng Rails 4.2.4 và Ruby 2.2.3p173). Đây là truy vấn duy nhất mà tôi có thể làm việc với cơ sở dữ liệu Postgres của mình:
Post.where("created_at >= TIMESTAMP 'now'")
Để truy vấn các bản ghi được tạo từ hôm nay
Sử dụng phạm vi với arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Sau đó, chúng ta có thể sử dụng nó
today_posts = Post.created_from_today
where('created_at >= now()')
sẽ chỉ tìm thấy các mục có tên_tạo_tạo trong tương lai.
.lteq(Time.zone.now.end_of_day))
.
Trong rails 4.2.3 để lấy các bản ghi được tạo ngày hôm nay, sử dụng mysql, hãy sử dụng như sau.
@usergoals = Goal.where ("userid =: userid và Date (create_at) =: date", {userid: params [: id], date: Date.today})
ở đây tôi đang sử dụng nhiều điều kiện nếu bạn muốn, bạn có thể chỉnh sửa nó cho một điều kiện.