2015-04-16 9 views
14

कोई भी ActiveJob::SerializationError से बचने के लिए एक साफ तरीका जानता है जो Date या Time ऑब्जेक्ट को क्रमबद्ध करने का प्रयास करते समय होता है? जब तर्क load वापस नौकरी में लोड हो रहा है और उसके बाद (जो बेकार है क्योंकि मैं बंदर की जरूरत पैचSerializationError Rails ActiveJob समय और दिनांक

  • कॉल मार्शल/JSON/YAML dump:

    दो समाधान मैं मिला है अब तक कर रहे हैं मेलर काम)

  • बंदर पैच Date और Time तो जैसे:

/lib/core_ext/time.rb

class Time 

    include GlobalID::Identification 

    def id 
    self.to_i 
    end 

    def self.find(id) 
    self.at(id.to_i) 
    end 
end 

/lib/core_ext/date.rb

class Date 

    include GlobalID::Identification 

    def id 
    self.to_time.id 
    end 

    def self.find(id) 
    Time.find(id).to_date 
    end 
end 

कौन सा भी बेकार है। किसी के पास बेहतर समाधान है?

+2

क्या नौकरी के लिए केवल तारीख या समय (और क्यों) पास करना वास्तव में आवश्यक है? मुझे लगता है कि नौकरी के पैरामीटर के रूप में ActiveModel को पास करना बेहतर होगा, संभवतः दिनांक या समय उदाहरण शामिल है। (ActiveModels में GlobalID :: पहचान शामिल है, इसलिए वे serialisable हैं) – sourcx

+0

नहीं, यह वास्तव में आवश्यक नहीं है। यह सिर्फ सुविधाजनक है। और इसके शीर्ष पर, हमने ActiveJob को एकीकृत करने से पहले DelayedJob के साथ काम किया। तो ... यह गूंगा लगता है कि मुझे बदलने के लिए कार्यक्षमता के विपरीत अमूर्त माना जाता है कि कुछ के साथ एकीकृत करने के लिए मुझे अपना कोड बदलने की आवश्यकता होगी। – kddeisz

+0

आप केवल दिनांक/समय वस्तु को अंजाम देते हैं? और कुछ नहीं? AFAIK, ActiveJob वास्तव में मार्शल को आपके ऑब्जेक्ट को क्रमबद्ध करने के लिए कहता है और बंदर पैच की तरह कुछ चाहिए जो आपने बाद में इस ऑब्जेक्ट को पुनर्प्राप्त करने और याद करने में सक्षम होने के लिए कहा था। क्या आप अपना मेलर पोस्ट कर सकते हैं? – lsdr

उत्तर

3

क्या आपको वास्तव में क्रमबद्धरण की आवश्यकता है? यदि यह सिर्फ एक समय/डेटटाइम ऑब्जेक्ट है, तो क्यों न केवल एन्कोड करें और यूनिक्स टाइमस्टैम्प आदिम के रूप में अपना पैरामीटर भेजें?

>> tick = Time.now 
=> 2016-03-30 01:19:52 -0400 

>> tick_unix = tick.to_i 
=> 1459315192 

# Send tick_unix as the param... 

>> tock = Time.at(tick_unix) 
=> 2016-03-30 01:19:52 -0400 

नोट यह एक सेकंड के भीतर सटीक होगा। यदि आपको 100% सटीक सटीकता की आवश्यकता है तो आपको समय को एक तर्कसंगत में बदलने की आवश्यकता होगी और संख्यात्मक और denominator दोनों को पैराम के रूप में पास करने की आवश्यकता होगी और फिर नौकरी के भीतर Time.at(Rational(numerator, denominator) पर कॉल करें।

>> tick = Time.now 
=> 2016-03-30 01:39:10 -0400 

>> tick_rational = tick.to_r 
=> (1459316350224979/1000000) 

>> numerator_param = tick_rational.numerator 
=> 1459316350224979 

>> denominator_param = tick_rational.denominator 
=> 1000000 

# On the other side of the pipe... 

>> tock = Time.at(Rational(numerator_param, denominator_param)) 
=> 2016-03-30 01:39:10 -0400 

>> tick == tock 
=> true 
+0

मुझे पता है कि मूल्य को बदलकर इसे करने के कई तरीके हैं, मैं बस सोच रहा था कि अन्य वस्तुओं के क्रमिकरण के साथ इसे करने का कोई तरीका है या नहीं। 'My_method (दिनांक, समय, मॉडल) 'पास करने में सक्षम होने के नाते और यह काम करता है। इस बिंदु पर यह काफी अप्रचलित है हालांकि इस सवाल को लगभग एक साल पहले पूछा गया था। – kddeisz

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