2012-03-02 26 views
11

Trong ứng dụng Rails 3.2, tôi có một truy vấn được xác định để trả về tất cả các mục sự kiện với: due_date bằng ngày hôm nay.Cách Rails để xác định ngày mai là gì?

@due_today = Event.where(:due_date => Time.now.beginning_of_day..Time.now.end_of_day) 

Tôi muốn sửa đổi điều này để trả lại tất cả sự kiện vào ngày hôm nay và ngày mai.

Cách tốt nhất để làm điều này là gì?

Tôi biết có một số tùy chọn có sẵn cho tôi:

Date.tomorrow 
Date.current.tomorrow 
Date.now.tomorrow 
DateTime.now.tomorrow.to_date 
Time.now.tomorrow.to_date 
Date.current+1 

Tôi chắc rằng có những người khác. Tất cả đều có thể hoán đổi cho nhau? Có sự khác biệt nào về hiệu suất không? Có bất kỳ vấn đề nào liên quan đến các cách tiếp cận khác nhau không? Tôi hoan nghênh mọi đề xuất về cách thực hiện cách tốt nhất.

Đối với thêm kudo: Tôi cũng muốn hiển thị: due_date là Hôm nay HH: MM hoặc Tomorrow HH: MM, trong đó HH: MM là thời gian. Có phương pháp nào được đưa vào Rails để hiển thị các ngày như Hôm nay hoặc Ngày mai không? Hoặc tôi sẽ cần phải xác định phạm vi của riêng tôi?

Rất cám ơn!

+0

tôi sẽ không lo lắng về hiệu suất quá nhiều. Bạn có thể sẽ không tính toán ngày hàng ngàn lần trong một vòng lặp chặt chẽ, do đó, sự khác biệt hiệu suất là không đáng kể. Đi với một trong đó là dễ đọc nhất. Lưu ý rằng 'current' sẽ tính múi giờ trong khi' now' thì không. – Dennis

Trả lời

21

Benchmarking này, tôi nhận được:

N = 100000 
Benchmark.bmbm do |test| 
    test.report("Date.tomorrow") do 
    N.times do 
     x = Date.tomorrow 
    end 
    end 
    test.report("Date.current.tomorrow") do 
    N.times do 
     x = Date.current.tomorrow 
    end 
    end 
    # test.report("Date.now.tomorrow") # => Coughs up an exception, Date.now doesn't exist! 
    test.report("DateTime.now.tomorrow.to_date") do 
    N.times do 
     x = DateTime.now.tomorrow.to_date 
    end  
    end 
    test.report("Time.now.tomorrow.to_date") do 
    N.times do 
     x = Time.now.tomorrow.to_date 
    end 
    end 
    test.report("Date.current+1") do 
    N.times do 
     x = Date.current+1 
    end 
    end 
    test.report("DateTime.tomorrow") do 
    N.times do 
     x = DateTime.now 
    end  
    end 
end 

Kết quả:

Rehearsal ----------------------------------------------------------------- 
Date.tomorrow     1.640000 0.010000 1.650000 ( 1.662668) 
Date.current.tomorrow   1.580000 0.000000 1.580000 ( 1.587714) 
DateTime.now.tomorrow.to_date 0.360000 0.010000 0.370000 ( 0.363281) 
Time.now.tomorrow.to_date  4.270000 0.010000 4.280000 ( 4.303273) 
Date.current+1     1.580000 0.010000 1.590000 ( 1.590406) 
DateTime.tomorrow    0.160000 0.000000 0.160000 ( 0.164075) 
-------------------------------------------------------- total: 9.630000sec 

            user  system  total  real 
Date.tomorrow     1.590000 0.000000 1.590000 ( 1.601091) 
Date.current.tomorrow   1.610000 0.010000 1.620000 ( 1.622415) 
DateTime.now.tomorrow.to_date 0.310000 0.000000 0.310000 ( 0.319628) 
Time.now.tomorrow.to_date  4.120000 0.010000 4.130000 ( 4.145556) 
Date.current+1     1.590000 0.000000 1.590000 ( 1.596724) 
DateTime.tomorrow    0.140000 0.000000 0.140000 ( 0.137487) 

Từ danh sách đề nghị, DateTime.now.tomorrow.to_date là nhanh hơn.

Kiểm tra tùy chọn cuối cùng tôi đã thêm vào mặc dù, nó trả về đối tượng Ngày và là nhanh nhất của nhóm theo dặm quốc gia. Nó cũng là một trong những người dễ đọc nhất trong danh sách.

Giả sử bạn đang sử dụng MYSQL, truy vấn của bạn có thể nhanh hơn nếu bạn sử dụng MySQL của GIỮA() chức năng:

@due_today = Event.where("due_date BETWEEN ? AND ?", DateTime.today, DateTime.tomorrow) 

Mặc dù tôi không chắc chắn nếu bạn có chỉ số về events.due_date hoặc nếu GIỮA chí vẫn sử dụng chúng. Bạn sẽ phải đánh giá cả hai để xem nhanh hơn với bộ DATA lớn.

Hy vọng điều đó sẽ giúp ích?

+0

Cảm ơn bodacious, câu trả lời tuyệt vời! Tuy nhiên DateTime ngày hôm nay trả về 'NoMethodError: phương thức riêng tư 'ngày hôm nay' được gọi là DateTime: Class'. Bất kỳ ý tưởng tại sao điều này sẽ được? Ngoài ra, tôi đang sử dụng Postgres hơn là MYSQL, nhưng tôi nghĩ toán tử 'BETWEEN' là stil hợp lệ. –

+0

Xin lỗi, lỗi của tôi. Tôi đã cố gắng gọi 'DateTime.today' thay vì' DateTime.now'. Và toán tử 'BETWEEN' đang hoạt động. Cảm ơn! Bạn có biết cách tôi có thể hiển thị ngày hôm nay là "Hôm nay" trong Rails không? –

+0

Âm thanh như bạn muốn hiển thị ngày ở định dạng tùy chỉnh tùy thuộc vào tình huống. Hãy xem bài đăng trên blog này: http://gavinmorrice.com/blog/posts/tagged/strftime và gist này https://gist.github.com/1957685 – bodacious

11

Làm thế nào về điều này?

1.day.from_now 
2.days.from_now 
3.days.from_now 

Nếu bạn muốn tăng một thời gian cụ thể

1.day.from_now(start_time) # gives a day after the start time 
Các vấn đề liên quan