2012-10-08 16 views
10

मेरे पास एक ऐसा दायरा है जो आज की कॉल के लिए पूछताछ करता है। दायरे के आधार पर मैं आज के लिए कॉल की मात्रा गिनने के लिए इसका उपयोग करता हूं।रेलों में दिनांक सीमा के लिए पूछताछ

मेरी तिथियां यूटीसी में संग्रहीत हैं लेकिन रेल मेरे स्थानीय टाइमज़ोन में परिवर्तित हो जाती हैं। मैं जो करने की कोशिश कर रहा हूं वह आज 00:00 और 23:59 बजे के बीच सभी कॉल ढूंढता है।

स्कोप:

scope :today, where("DATE(transfer_date) BETWEEN ? AND ?", Time.zone.now.utc.beginning_of_day, Time.zone.now.utc.end_of_day) 

आईआरबी उत्पादन: (कॉल यह यूटीसी के कारण फैल जाती है)

irb(main):010:0> Call.last.transfer_date 
    Call Load (0.9ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> Sun, 07 Oct 2012 19:45:00 CDT -05:00 
irb(main):011:0> 

irb(main):011:0> Call.last.transfer_date.utc 
    Call Load (1.3ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> 2012-10-08 00:45:00 UTC 
मैं यह पता लगाने की कैसे केवल कॉल कि 0:00 के बीच थे क्वेरी करने के लिए कोशिश कर रहा हूँ

और आज के लिए 23:59। अब तक यूटीसी, जोन आदि के साथ और बिना गुंजाइश करने की कोशिश कर रहा है। यह यूटीसी के आधार पर दायरे को खींचता रहता है जिसमें कल से कॉल शामिल है (कल अगर यह स्थानीय टाइमज़ोन के साथ स्वरूपित है)।

सही आउटपुट प्राप्त करने के लिए मैं दो बार पूछताछ कैसे कर सकता हूं? मैं यहाँ खो गया हूँ।

scope :today, where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day) 
+0

क्या आप कृपया अपने प्रश्न स्पष्ट कर सकते हैं, इसका मतलब है कि आपने किस मॉडल को दायरा दिया है, और नीचे आप आज के रूप में नहीं लिखा था। –

उत्तर

7

मैं इस प्रकार के रूप में मेरी गुंजाइश दोबारा लिख ​​कर यूटीसी के लिए क्षतिपूर्ति करने में सक्षम था।

scope :today, where(:transfer_date => Date.today...Date.tomorrow) 
13

आप एक विशेष श्रेणी का उपयोग कर सकते हैं:

0

शायद यह अधिक है, लेकिन मैं समय सीमा प्राप्त करने और फिर डीबी से पूछताछ के लिए एक सहायक विधि का उपयोग करने का सुझाव दूंगा।

# Gets time range for x number timeunits ago 
    def time_range(unit, timeunit = nil) 
    if timeunit == "weeks" 
     now = Time.zone.now.beginning_of_week 
    elsif timeunit == "months" 
     now = Time.zone.now.beginning_of_month 
    else 
     now = Time.zone.now.beginning_of_day 
    end 
    # Ex: time_range(0, "days") --> Get the time range for today between the beginning of today and the beginning of tommorow - 1 second 
    now - unit.send(timeunit)..now + 1.send(timeunit) - 1.seconds - unit.send(timeunit) 
    end 

कुछ समय सीमाओं का अनुरोध करने में आपकी सहायता करेगा। तो जब आप कुछ ऐसा अनुरोध करते हैं;

time_range(0, "days") 

यह 0 दिन पहले (आज) के लिए समय सीमा वापस करेगा;

Wed, 07 Sep 2016 00:00:00 UTC +00:00..Wed, 07 Sep 2016 23:59:59 UTC +00:00 

और फिर आप बस डेटाबेस वस्तु क्वेरी और साथ सीमा के भीतर सब कुछ भरोसा कर सकते हैं;

Calls.where(transfer_date: time_range(unit, timeunit)).count 
+0

यह अच्छा है, और उदाहरण के लिए धन्यवाद, लेकिन मैं कुछ साल पहले एक साधारण लैम्ब्डा स्कोप के साथ जा रहा था :) – nulltek

+0

कोई समस्या नहीं आदमी! शायद भविष्य के उपयोग के लिए –

संबंधित मुद्दे