रेल पक्ष में समाधान
ऐसा लगता है कि रेल (5.2) में प्रयुक्त ActiveRecord स्वचालित रूप से created_at
को बचाने में दशमलव सेकंड को 1 मिसे तक जोड़ देता है और updated_at
या डीबी में कोई अन्य टाइमस्टैम्प कॉलम जो उप-सेकंड स्वीकार करता है, जैसा कि फ़ाइल में परिभाषित किया गया है active_record/connection_adapters/abstract/quoting.rb
एक कामकाज यह है। इस लाइन को किसी भी फाइल में शीर्ष स्तर पर जोड़ें, जिसे किसी मॉडल (जैसे, ApplicationRecord मॉडल फ़ाइल) तक पहुँचने पर हमेशा रेल द्वारा पढ़ा जाएगा।
Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'
module ActiveRecord::ConnectionAdapters::Quoting
alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)
def quoted_date(*rest, **kwd)
quoted = quoted_date_orig(*rest, **kwd)
quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
end
end
एक नया रिकॉर्ड बनाने के बाद, आप रेल कंसोल से इसकी पुष्टि कर सकते हैं,
MyModel.last.created_at.nsec # => 0
या इसे देखने के लिए सीधे DB तक पहुंचें।
चेतावनी
यह परिवर्तन न केवल created_at
. को प्रभावित करता है और updated_at
लेकिन डीबी में अन्य सभी टाइमस्टैम्प कॉलम भी। मुझे लगता है कि आप अभी भी अपने मॉडल उदाहरण के लिए एक समय उदाहरण के विपरीत स्ट्रिंग सेट करके इस तरह के कॉलम में एमएसईसी (या एनएसईसी) परिशुद्धता के लिए एक मान सहेज सकते हैं जैसे my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; फिर Time::DATE_FORMATS[:db]
रिकॉर्ड को सहेजने में संदर्भित नहीं किया जाएगा।
लारवेल पक्ष में संभावित समाधान
यह लिखते समय (2018-10-18) मुश्किल हो सकता है, लेकिन एक cmbertsch01 की हाल की लाराकास्ट पोस्ट
(नोट:टिप्पणी के बाद मूल पोस्ट के एक दिन बाद किया गया एक बड़ा अपडेट।)