2015-04-16 17 views
14

Date veya Time nesnesini seri hale getirmeye çalışırken ActiveJob::SerializationError önlemek için temiz bir yol biliyor musunuz? yama Ben maymun gerektiğinden berbat olan (Job geri sonra load argümanlar yükleme ve ne zamanSerializationError Rails ActiveJob Saat ve Tarih

  • Çağrı Mareşal/JSON/YAML dump:

    yaşadım iki çözümden

    şimdiye kadar üzeresiniz postacı iş)
  • Maymun yama Date ve Time şöyle:

/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 da berbat

class Date 

    include GlobalID::Identification 

    def id 
    self.to_time.id 
    end 

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

. Daha iyi bir çözümü olan var mı?

+2

o işin (ve neden) sadece Tarih veya Saat geçmek gerçekten gerekli mi? Bir ActiveModel'i, muhtemelen bir Tarih veya Zaman örneği içeren, işe bir parametre olarak iletmenin daha iyi olacağını düşünüyorum. (ActiveModels GlobalID :: Identification içerir, böylece seri hale gelirler) – sourcx

+0

Hayır, gerçekten gerekli değil. Bu sadece uygun. Ve bunun üzerine, ActiveJob'u entegre etmeden önce DelayedJob ile çalıştı. Öyleyse, değişme işlevselliğinin aksine soyut olması gereken bir şeyle bütünleşmek için kodumu değiştirmem gerekecek gibi görünüyor. – kddeisz

+0

Yalnızca Tarih/Saat nesnesini mi atadınız? Başka hiçbir şey? AFAIK, ActiveJob, aslında Marshal'ı, nesneyinizi serileştirmek için çağırır ve daha sonra bu nesneyi alıp geri çağırmak için söylediğin maymun yama gibi bir şeye ihtiyaç duyar. Mailerinizi gönderebilir misiniz? – lsdr

cevap

3

Seri hale getirmeye gerçekten ihtiyacınız var mı? Yalnızca bir Time/DateTime nesnesi ise, parametrelerinizi sadece Unix zaman damgası ilkel olarak kodlamak ve göndermek neden olmasın?

>> 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 

Not: Bir saniye içinde bu doğru olacaktır. % 100 kesin doğruluğa ihtiyacınız varsa, zamanı bir Rational'a dönüştürmeniz ve hem pay hem de paydayı params olarak iletmeniz ve işin içinde Time.at(Rational(numerator, denominator)'u aramanız gerekir.

>> 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

Değeri değiştirerek bunu yapmanın birçok yolu olduğunu biliyorum, sadece diğer nesnelerin serileştirilmesiyle bağlantılı olarak bir yol olup olmadığını merak ediyorum. My_method (tarih, saat, model) 'i geçebildiğim gibi ve çalışmasını sağlayın. Bu noktada oldukça modası geçmiş olsa da, bu soru neredeyse bir yıl önce sorulmuştur. – kddeisz

İlgili konular