2012-02-22 8 views
1

したがって、バックグラウンドで実行したいと思うヘルパーに多くのデータベース操作があります。例として、私はユーザヘルパーでrecord_activityメソッドを定義します。ポストは私が投稿コントローラでメソッドを作成するには、すなわち、この活動を記録したい作成されるとき:delay_jobを使用してユーザー定義のヘルパーメソッドを遅延させます

def create 
    #operations to save the post 
    record_activity(user, post) 
end 

パフォーマンス上の理由から、私はこのrecord_activityと他人を遅らせるようにしたい、そしてバックに労働者とそれらを実行します終わり。私はdelayed_jobを使ってメーラーを遅らせ、それはうまく機能します。

:レールコンソールで、method.delay、すなわち素晴らしい作品私は、レールコンソールで行うことができます:コントローラに書き込まれたときに、次はまだ遅れていない、ライブ走るすなわちしかし、同じ.delayは動作しません

record_activity.delay 

def create 
    #operations to save the post 
    record_activity(user, post).delay 
end 

なぜですか?私は1つのアプリでRails 3.0.9を使用していて、もう1つはRails 3.1.3を使用しています。さらに、2.1.4のdelayed_jobを持っています。

誰もこの仕事をする方法を提案できますか?

EDIT *

私はmu_is_too_shortが提供する答えが正しい道だと思います。遅延ジョブが作成されますが、record_activityメソッドは正しく実行されません。 delayed_jobワーカーが起動すると、delayed_jobを実行し、エラーはなく、動作しているかのようにレコードを削除します。しかし、活動は記録されません。

self.delay.record_activity(user, @comment) 

と方法:

def record_activity(current_user, act) 
    activity = Activity.new 
    activity.user_id = current_user.id 
    activity.act_id = act.id 
    activity.act_type = act.class.name 
    activity.created_at = act.created_at 
    activity.save 
end 

私は、その後に、多分私はユーザー変数を通過できなかったと思ったいくつかのコンテキストを与えるために、ここでのコールと私は今、トラブルシューティング午前方法がありますこの場合、整数値などを渡すだけです。私はdelayed_job労働者を再起動し、無駄に、これらの方法を試してみました:

self.delay.record_activity(user.id, @comment.id, @comment.class.name, @comment.created_at) 

、変更方法:

def record_activity(current_user_id, act_id, act_type, act_created_at) 
    activity = Activity.new 
    activity.user_id = current_user_id 
    activity.act_id = act_id 
    activity.act_type = act_type 
    activity.created_at = act_created_at 
    activity.save 
    end 

答えて

2

私はコンソールでrecord_activity.delayを考えていないあなたはそれだと思う道を働いています。それはrecord_activityの前に実行され、delayには何もできません。

delay呼び出しが最初に行かなければならない、あなたはあなたの遅延方法はdelay戻りものに呼び出す:

def create 
    self.delay.record_activity(user, post) 
end 

delayコールが(おそらくmethod_missingを通じて)すべてのメソッド呼び出しをインターセプトするオブジェクトを返しますが、それらをYAMLizes 、データベース内の遅延ジョブキューテーブルにYAMLを追加します。つまり、record_activity.delayは何も役に立ちません。ちょうどrecord_activityを実行し、遅延ジョブインターセプタオブジェクトを作成し、delayが作成したものをスローします。

+0

これはかなりうまく見え、遅延ジョブを作成します。ただし、実行すると、record_activityは正常に完了しません(つまり、アクティビティレコードは作成されません)が、エラーは発生しません。そのため、ジョブはdelayed_jobsテーブルから消えます。仕事を遅らせることの限界は何ですか?ここにアドバイスはありますか?ここで問題が遅れているのですか? – jay

+0

@jay:あなたの退職した労働者を再開しましたか?彼らは何も自動リロードしません。 'record_activity'はどのように見えますか? 'delay'コールなしで正常に動作しますか? –

+0

がテストを再開しました。質問にrecord_activityを追加します(テストしたバリエーションも同様)。 – jay

関連する問題