2012-03-02 15 views
11

एक रेल 3.2 एप में, मेरे पास सभी इवेंट आइटम्स को वापस करने के लिए परिभाषित एक क्वेरी है: due_date आज के बराबर है।कल की तारीख को परिभाषित करने के लिए रेल मार्ग क्या है?

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

मैं आज और कल के कारण सभी घटनाओं को वापस करने के लिए इसे संशोधित करना चाहता हूं।

ऐसा करने का सबसे अच्छा तरीका क्या है?

मुझे पता है कि मेरे लिए कई विकल्प उपलब्ध हैं:

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

मुझे यकीन है कि वहाँ दूसरों रहे हैं रहा हूँ। क्या ये सभी अदलाबदल योग्य हैं? प्रदर्शन में कोई अंतर है? क्या विभिन्न दृष्टिकोणों से जुड़े कोई मुद्दे हैं? मैं ऐसा करने के लिए किसी भी सुझाव का स्वागत करता हूं कि सर्वोत्तम ऐसा करने का तरीका है।

अतिरिक्त कुडोस के लिए: मैं भी: डीएच: एमएम या कल एचएच: एमएम के रूप में देय_डेट को प्रदर्शित करना चाहता हूं, जहां एचएच: एमएम समय है। आज या कल के रूप में तारीखों को प्रदर्शित करने के लिए रेल में एक विधि पकाया गया है? या मुझे अपना खुद का दायरा परिभाषित करने की आवश्यकता होगी?

बहुत धन्यवाद!

+0

को बढ़ा देते हैं, तो मैं प्रदर्शन के बारे में बहुत ज्यादा चिंता नहीं होता। आप शायद तंग लूप में हजारों बार की तारीख की गणना नहीं करेंगे, इसलिए प्रदर्शन अंतर नगण्य हैं। सबसे ज्यादा पढ़ने योग्य के साथ जाओ। ध्यान दें कि 'वर्तमान' समय-समय पर खाता लेता है जबकि 'अब' नहीं होता है। – Dennis

उत्तर

21

इन बेंचमार्किंग, मैं मिलता है:

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 

परिणाम:

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) 

सुझाव की अपनी सूची से, DateTime.now.tomorrow.to_date तेज है।

हालांकि मैंने जो अंतिम विकल्प जोड़ा है, उसे देखें, यह दिनांक वस्तु देता है और देश के मील द्वारा गुच्छा का सबसे तेज़ है। यह सूची से सबसे ज्यादा मानव-पठनीय में से एक है।

आप MYSQL का उपयोग कर रहे मानते हुए, आपकी क्वेरी के लिए तेजी से अगर आप MySQL के बीच() फ़ंक्शन का उपयोग हो सकता है:

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

हालांकि मुझे यकीन है कि अगर आप events.due_date पर या बीच इच्छा करता है, तो अनुक्रमित नहीं कर रहा हूँ अभी भी इन का उपयोग करें। आपको यह देखने के लिए दोनों को बेंचमार्क करना होगा कि एक बड़े डेटा सेट के साथ तेज कौन सा है।

उम्मीद है कि मदद करता है?

+0

धन्यवाद बोडायस, उत्कृष्ट जवाब! हालांकि डेटटाइम आज 'NoMethodError: निजी विधि' देता है जिसे आज डेटटाइम के लिए बुलाया जाता है: कक्षा'। कोई विचार यह क्यों होगा? इसके अलावा, मैं MYSQL की बजाय पोस्टग्रेस का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि 'BETWEEN' ऑपरेटर मान्य है। –

+0

क्षमा करें, मेरी गलती। मैं 'dateTime.now' की बजाय' DateTime.today' को कॉल करने का प्रयास कर रहा था। और 'BETWEEN' ऑपरेटर काम कर रहा है। धन्यवाद! क्या आप जानते हैं कि मैं आज की तारीख को रेल में "आज" के रूप में कैसे प्रदर्शित कर सकता हूं? –

+0

लगता है जैसे आप स्थिति के आधार पर कस्टम प्रारूपों में तिथियां प्रदर्शित करना चाहते हैं। इस ब्लॉग पोस्ट को देखें: http://gavinmorrice.com/blog/posts/tagged/strftime और यह आलेख https://gist.github.com/1957685 – bodacious

11

इस बारे में कैसे?

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

आप एक विशिष्ट समय

1.day.from_now(start_time) # gives a day after the start time 
संबंधित मुद्दे