2013-12-17 4 views
18

प्रलेखन चार प्रकार के समय से संबंधित फ़ील्ड प्रकारों का उल्लेख करता है (http://mongoid.org/en/mongoid/docs/documents.html#fields)। अन्य डेटाबेस में, मैं देख सकता हूं कि इन फ़ील्ड डेटाबेस में अंतर प्रकार कैसे होंगे, लेकिन मोंगोडीबी के लिए वे सभी दिनांक प्रकार नहीं होंगे? क्या यह सिर्फ ActiveRecord के साथ स्थिरता के लिए है?मोंगोइड में, दिनांक, समय, दिनांक समय, और टाइमविथज़ोन फ़ील्ड प्रकारों में कोई अंतर है?

उत्तर

10

उनके बीच लगभग कोई अंतर नहीं है, वे सभी समय प्रकार लपेटते हैं। आप मोंगो से अनसुलझा करने के बाद इस प्रकार के उदाहरण प्राप्त करने के लिए डेटटाइम, दिनांक या टाइमविथज़ोन बदल सकते हैं।

Mongoid डेटा बाध्यकारी के लिए demongoize/mongoize विधियों को जोड़ने के लिए इस वर्ग को बढ़ाता है। तो एकमात्र अंतर कार्यान्वयन में है।

तो समय कार्यान्वयन

def demongoize(object) 
    return nil if object.blank? 
    object = object.getlocal unless Mongoid::Config.use_utc? 
    if Mongoid::Config.use_activesupport_time_zone? 
    object = object.in_time_zone(Mongoid.time_zone) 
    end 
    object 
end 

def mongoize(object) 
    return nil if object.blank? 
    begin 
    time = object.__mongoize_time__ 
    if object.respond_to?(:sec_fraction) 
     ::Time.at(time.to_i, object.sec_fraction * 10**6).utc 
    elsif time.respond_to?(:subsec) 
     ::Time.at(time.to_i, time.subsec * 10**6).utc 
    else 
     ::Time.at(time.to_i, time.usec).utc 
    end 
    rescue ArgumentError 
    EPOCH 
    end 
end 

दिनांक कार्यान्वयन

def demongoize(object) 
    ::Date.new(object.year, object.month, object.day) if object 
end 


def mongoize(object) 
    unless object.blank? 
    begin 
     time = object.__mongoize_time__ 
     ::Time.utc(time.year, time.month, time.day) 
    rescue ArgumentError 
     EPOCH 
    end 
    end 
end 

आप देख सकते हैं अन्य implemetations

https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date.rb#L46 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date_time.rb#L49 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time.rb#L48 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time_with_zone.rb#L32

+0

बस एक चेतावनी: मैंने rspec परीक्षणों में एक अजीब बग देखी है, जहां मिलीटाइम फ़ील्ड पर दावा कभी-कभी मिलीसेकंद अंतर के कारण विफल हो जाता है। मुझे समय के साथ या समस्या से पहले किसी ऑब्जेक्ट को व्यवस्थित रूप से पुनः लोड करने में समस्या नहीं है। –

+0

यह जवाब Mongoid 6.2 में सच नहीं है। मोंगोइड का 'टाइम' डेटा प्रकार 'ActiveSupport :: TimeWithZone' को संग्रहीत करने के लिए कार्य करता है, जबकि 'डेटटाइम' एक शुद्ध रूबी 'डेटटाइम' है। और इन दोनों के बीच महत्वपूर्ण अंतर हैं। – skalee

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