2012-03-02 19 views
11

Rails 3.2 uygulamasında, tüm Event öğelerini şu değerlerle döndürmek için tanımlanmış bir sorguya sahibim: due_date bugüne eşittir.Yarının tarihini tanımlamak için Rails yolu nedir?

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

Bugün ve yarın tüm olayları döndürmek için bunu değiştirmek istiyorum.

Bunu yapmanın en iyi yolu nedir? Diğerleri vardır eminim

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

:

Ben çeşitli seçenekler bana olduğunu biliyoruz. Bunların hepsi değiştirilebilir mi? Performansta herhangi bir farklılık var mı? Farklı yaklaşımlarla ilişkili herhangi bir sorun var mı? Bunun için en iyi yolu ile ilgili herhangi bir öneri memnuniyetle karşılarız.

Ek kudos için: Ayrıca şunu göstermek istiyorum: due_date Bugün HH: MM veya Yarın HH: MM, burada HH: MM zamanı. Tarih veya Bugün olarak tarihleri ​​göstermek için Rails'e yapılan bir yöntem var mı? Yoksa kendi kapsamımı tanımlamam gerekecek mi?

Çok teşekkürler! Bu Kıyaslama

+0

artırır istiyorsanız ben çok fazla performansı hakkında endişe olmaz. Büyük bir döngüde binlerce kez tarih hesaplamayacaksınız, bu nedenle performans farkları göz ardı edilebilir. En okunaklı olanla git. 'Şu an', 'şu an' değilken zaman dilimini hesaba katar. – Dennis

cevap

21

, alıyorum:

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 

Sonuçlar:

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) 

öneri listenizden DateTime.now.tomorrow.to_date hızlıdır.

Yine de eklediğiniz son seçeneğe bir göz atın, bir Date nesnesini döndürür ve bir ülke miliyle grubun en hızlısıdır. Aynı zamanda listeden en insan tarafından okunabilir biridir.

MySQL en() fonksiyonu ARASINDA kullanıyorsanız, sorgu daha hızlı olabilir, sen MYSQL kullandığınız varsayarak:

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

Sana events.due_date veya irade ARASINDA eğer dizin varsa emin değilim rağmen hala bunları kullan. Büyük bir DATA seti ile hangisinin daha hızlı olduğunu görmek için karşılaştırmanız gerekir.

Bu yardımcı olur mu?

+0

Sağduyulu, mükemmel cevap! Ancak DateTime bugün 'NoMethodError: private method 'ifadesini bugün' DateTime: Class' için çağırdı. Bunun neden olabileceği hakkında bir fikrin var mı? Ayrıca, MYSQL yerine Postgres kullanıyorum, ama "BETWEEN" operatörünün geçerli olduğunu düşünüyorum. –

+0

Üzgünüm, benim hatam. DateTime.now' yerine "DateTime.today" aramaya çalışıyordum. Ve "BETWEEN" operatör çalışıyor. Teşekkürler! Rails'de bugünün tarihini "Bugün" olarak nasıl görüntüleyebileceğimi biliyor musunuz? –

+0

Tarihler, duruma bağlı olarak özel biçimlerde görüntülemek istediğiniz gibi görünüyor. Bu blog gönderisine göz atın: http://gavinmorrice.com/blog/posts/tagged/strftime ve bu isim https://gist.github.com/1957685 – bodacious

11

Bu nasıl?

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

Belirli bir zaman

1.day.from_now(start_time) # gives a day after the start time 
İlgili konular