2012-03-15 18 views
13

अगर मैं नए एआर वस्तु बनाने के दौरान एक StringDatetime में स्तंभ पारित, यह स्वतः ही पार्स किया जाएगा:ActiveRecord पार्स स्ट्रिंग डेटाटाइम करने के लिए?

1.9.2p290 :011 > Movie.new(:release_date=>"21-Nov-1990") 
=> #<Movie id: nil, release_date: "1990-11-21 00:00:00", created_at: nil, updated_at: nil> 

कैसे Rails, या ActiveRecord, इस जादू क्या करता है? यह किस विधि का उपयोग करता है?

उत्तर

17

रेल to_date विधि String पर विधि जोड़ती है। इसके स्रोत सरल है:

# File activesupport/lib/active_support/core_ext/string/conversions.rb, line 42 
def to_date 
    return nil if self.blank? 
    ::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday)) 
end 

Date._parse रूबी के मूल निवासी है (एक ही विधि Date.parse द्वारा कहा जाता है) और यह where the real work is done है।

यह पहली बार स्ट्रिंग से बाहरी प्रतीकों को दूर करने के लिए रेगुलर एक्सप्रेशन का उपयोग करता है तो _parse_eu, _parse_iso, _parse_dot और इतने पर जैसे अन्य तरीकों को पास कर देता। इनमें से प्रत्येक अपने स्वयं के नियमित अभिव्यक्तियों और अन्य विधियों का उपयोग यह देखने के लिए करता है कि यह एक तारीख है जो इसे समझती है और अर्थपूर्ण जानकारी निकालती है। एक बार उनमें से एक "काम करता है" (यानी सच हो जाता है), शेष छोड़ दिए जाते हैं। आखिरकार, _parse में, निकाली गई जानकारी का उपयोग दिनांक और समय बनाने के लिए किया जाता है, सप्ताह के दिन की जांच करने जैसी चीजों को जानने के लिए थोड़ा और काम करना और क्या "12" का वर्ष मूल्य 1 9 12 या 2012 होना चाहिए।

दस्तावेज़ इसे एक उदारवादी विधि कहते हैं, जिसका अर्थ यह हो सकता है कि यह दीवार पर संभावनाओं का एक गुच्छा फेंकता है कि क्या चिपक जाती है। यह बहुत खराब दस्तावेज है लेकिन उल्लेखनीय रूप से अच्छी तरह से काम करता है।

1

शायद आप Date.strptime(str) का उपयोग करना चाहते हैं।

+1

'strptime' दिनांक स्वरूप को पता है अन्यथा यह उसके डिफ़ॉल्ट प्रारूप का प्रयोग करेंगे है। लेकिन एआर कई प्रारूपों में जादुई रूप से तारीखों का विश्लेषण कर सकता है। –

+0

सुनिश्चित करें कि आप सभी दिनांक प्रारूपों का परीक्षण कर रहे हैं जो उपयोगकर्ता उपस्थित हो सकते हैं। वे हमेशा निर्धारवादी नहीं होते हैं। – aceofspades

2

यदि आपको समय चाहिए तो to_datetime भी है।

0

अन्य टिप्पणी के रूप में और प्रलेखन पता चलता है, String#to_datetime "दिनांक समय मूल्य के लिए एक स्ट्रिंग में कनवर्ट करता है।":

"1-1-2012".to_datetime   # => Sun, 01 Jan 2012 00:00:00 +0000 
"01/01/2012 23:59:59".to_datetime # => Sun, 01 Jan 2012 23:59:59 +0000 
"2012-12-13 12:50".to_datetime # => Thu, 13 Dec 2012 12:50:00 +0000 
"12/13/2012".to_datetime   # => ArgumentError: invalid date 
संबंधित मुद्दे