DelayedJob を使用しているときに、ストレージのシリアライゼーション エラーが発生する。次の ActiveRecord クラス User があるとします。
class User < ActiveRecord::Base
serialize :metadata, UserMetaData
end
UserMetaData は次のようになります。
class UserMetaData < Hash
def some_function
#do work
end
end
私の DelayedJob がこれを内部的に行う場合:
class MyJob
attr_accessor :user_id
def initialize(user_id)
self.user_id = user_id
end
def perform
@user = User.find(self.user_id)
end
end
実行するたびに、ローカルで次のエラーが発生します。
[Worker(host:home pid:87197)] MyJob failed with ActiveRecord::SerializationTypeMismatch: Attribute was supposed to be a UserMetaData, but was a Hash - 2 failed attempts
DelayedJob システムの外でも問題なく動作します。データベースからレコードを取得するたびに、正しく逆シリアル化されていないようです。User クラスを次のように変更すると、次のようになることに気付きました。
serialize :metadata, Hash
これは問題なく動作しますが、DelayedJob 内の Hash と DelayedJob システム外の UserMetaData として出力されます。ここでの問題は、DelayedJob システムにいる場合、UserMetaData クラス (つまり、@user.metadata.some_function) で関数を使用できないことです。それをどうするかはよくわかりません。どんな指針も本当に役に立ちます。
更新: この問題に関連するオープン チケットが Github にもあるようです: https://github.com/collectiveidea/delayed_job/issues/300。
ありがとう!