延迟作业:反序列化ActiveRecord对象会在可序列化字段上引发序列化TypeMistmatch错误

时间:2012-04-17 21:29:59

标签: ruby-on-rails ruby activerecord delayed-job

使用DelayedJob时出现strage序列化错误。假设我有以下ActiveRecord类用户:

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

谢谢!

0 个答案:

没有答案