単純なアチーブメントシステムを作成し、delayed_job(2.1.4)を導入して処理を処理したいと思いました。ただし、delayed_jobsテーブルのハンドラ列は常にnilであるため、last_errorテキストが生成されます。Job failed to load: instance of IO needed. Handler nil
これが私の設定です:
アチーブメントオブザーバー
class AchievementObserver < ActiveRecord::Observer
observe User, Comment, ...
def after_create(record)
# initiate delayed job to check conditions
Delayed::Job.enqueue(TrophyJob.new(record.id, record.class.name))
end
...
end
トロフィージョブ
class TrophyJob < Struct.new(:record_id, :record_type)
def perform
case record_type
when "User"
UserProfileCompleteTrophy.progress(User.find(record_id)) # complete your profile settings
NewsletterReceiverTrophy.progress(User.find(record_id)) # sign up for the newsletter
when "Comment"
CommentsAuthoredTrophy.progress(Comment.find(record_id)) # create x comments
...
end
end
end
delayd_jobsテーブルのエントリが作成されます。ただし、ハンドラーは常にNULLです。私はすでにさまざまなことを試しました(以前は完全なオブジェクトを通過しましたが、ここで説明するようにid + classnameを使用しました: delayed_jobでの奇妙な例外;オブザーバーでxxxTrophy.delay.progress(...)を試しました;など)-すべてなしラック。
私も持っています
require 'yaml'
YAML::ENGINE.yamler= 'syck'
私のboot.rbで。
言及する価値のある1つのこと:last_errorテキストはdelayed_jobで埋められますが、attempts列とfailed_at列はNULLのままです。
私は何が欠けていますか?
アップデート
シリアル化が期待どおりに機能することを確認しました。
ruby-1.9.2-p290 :004 > TrophyJob.new(1, "User").to_yaml
=> "--- !ruby/struct:TrophyJob \nrecord_id: 1\nrecord_type: User\n"