2012-01-13 16 views
6

इस प्रकार मैं एक रेल 3.0 अनुप्रयोग में एक गुंजाइश spec'ing हूँ के लिए Timecop मणि का उपयोग करना:कार्यक्षेत्र

before do 
    @list = DrawingList.create #things that include begin and end dates 
end 

it "doesn't find an active drawing if they are out of range" do 
    pending "really need to figure out how to work timecop in the presence of scopes" 
    Timecop.travel(2.days) 
    puts Date.today.to_s 
    DrawingList.active_drawings.first.should be_nil 
end 

आप हो सकता है के रूप में:

class DrawingList < ActiveRecord::Base 
    scope :active_drawings, where('start_date <= ? AND end_date >= ?', Date.today, Date.today) 
end 

मेरी कल्पना में, मैं क्या करना चाहते हैं कल्पना करें, रखता है वास्तव में दिखाता है कि तिथि। आज दो दिन है। हालांकि, दायरे का मूल्यांकन एक अलग संदर्भ में किया जाता है, इसलिए यह पुराने "आज" का उपयोग करता है। आज एक संदर्भ में मूल्यांकन कैसे किया जाता है कि टाइमकॉप प्रभावित हो सकता है।

धन्यवाद!

उत्तर

18

यह वास्तव में एक आम गलती है। जैसा कि आपने दायरे द्वारा उपयोग की गई तारीख में लिखा है वह तारीख है जब कोड लोड किया गया था। क्या आप इसे उत्पादन में चलाने के लिए थे, जहां कोड केवल तभी लोड किया जाता है जब आप ऐप को पुनरारंभ करते हैं (विकास के विपरीत जहां इसे प्रत्येक अनुरोध पर पुनः लोड किया जाता है), आपको उस दिन सही परिणाम मिलेंगे जब आपने ऐप को पुनरारंभ किया था, लेकिन अगले दिन परिणाम 2 दिन आदि द्वारा एक दिन बाद, दिन के आधार पर किया जाएगा

ऐसे ही एक गुंजाइश को परिभाषित करने का सही तरीका

scope :active_drawings, lambda { where('start_date <= ? AND end_date >= ?', Date.today, Date.today)} 

है लैम्ब्डा सुनिश्चित करता है कि उन तारीखों हर बार गुंजाइश प्रयोग किया जाता है मूल्यांकन किया जाता है ।

+0

एक अच्छे प्रश्न का अच्छा जवाब। –

+0

पकड़ने के लिए यह एक मुश्किल मुद्दा है! धन्यवाद। मैं बहुत खुश हूं अब मैं इस व्यवहार से अवगत हूं। –

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