2012-10-10 5 views
15

मैं ऐसा दिखता है जैसे मेरी Waiver मॉडल पर एक age विधि है:तुलना में विफल रहा है

def age(date = nil) 

    if date.nil? 
     date = Date.today 
    end 
    age = 0 
    unless date_of_birth.nil? 
     age = date.year - date_of_birth.year 
     age -= 1 if date < date_of_birth + age.years #for days before birthday 
    end 
    return age 
    end 

मैं तो एक कल्पना है कि लग रहा है जैसे:

it "calculates the proper age" do 
waiver = FactoryGirl.create(:waiver, date_of_birth: 12.years.ago) 
waiver.age.should == 12 
end 

जब मैं इस spec को चलाने के लिए मुझे comparison of Date with ActiveSupport::TimeWithZone failed मिलता है। मैं क्या गलत कर रहा हूं?

Failures: 

    1) Waiver calculates the proper age 
    Failure/Error: waiver.age.should == 12 
    ArgumentError: 
     comparison of Date with ActiveSupport::TimeWithZone failed 
    # ./app/models/waiver.rb:132:in `<' 
    # ./app/models/waiver.rb:132:in `age' 
    # ./spec/models/waiver_spec.rb:23:in `block (2 levels) in <top (required)>' 
+0

मैं नहीं जानता कि क्यों यह विफल हो रहा है, लेकिन यह ठीक काम कर रहा है, तो आप '12.years.ago को date_of_birth सेट करें: अपने तुलनात्मक समय-टू-डेट करने के लिए, अभिव्यक्ति के बजाय के रूप में लिखा जा सकता है। to_date' और '12.years.ago' नहीं। गहराई से स्पष्टीकरण के लिए – oldergod

उत्तर

34

आप अभिव्यक्ति date < date_of_birth + age.years में ActiveSupport::TimeWithZone का एक उदाहरण के साथ Date का एक उदाहरण की तुलना कर रहे हैं; ActiveSupport :: TimeWithZone है, according to the docs, एक समय-जैसी कक्षा जो किसी भी समय क्षेत्र में एक समय का प्रतिनिधित्व कर सकती है। आप किसी प्रकार का रूपांतरण किए बिना Date और Time ऑब्जेक्ट्स की तुलना नहीं कर सकते हैं। कंसोल पर Date.today < Time.now आज़माएं; आपको एक समान त्रुटि दिखाई देगी।

12.years.ago जैसे अभिव्यक्तियां और सामान्य ActiveRecord टाइमस्टैम्प ActiveSupport :: TimeWithZone के उदाहरण हैं। आप यह सुनिश्चित करने से सबसे अच्छे हैं कि आप केवल Time ऑब्जेक्ट्स या Date ऑब्जेक्ट्स के साथ सौदा करते हैं, लेकिन इस विधि में दोनों नहीं।

age -= 1 if date < (date_of_birth + age.years).to_date 
+0

धन्यवाद। मैंने अपने कोड में उचित बदलाव किए हैं और अब सबकुछ बढ़िया काम कर रहा है! –

+0

असल में, आप डेटविथज़ोन के साथ दिनांक की तुलना कर सकते हैं, लेकिन ऐसा लगता है कि रेल डिफ़ॉल्ट रूप से दिनांक 00:00:00 यूटीसी को परिवर्तित कर देगा, जो कि बग पेश कर सकता है। अर्थात। >> 'Time.zone.parse ('मंगलवार, 01 अगस्त 2017 00:00:00 CEST +02: 00') 'true' – Magne