1

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

ありがとう!

4

0 に答える 0