0

私はtobiによってdelayed_jobを実行していますが、delayed_jobを実行すると、fbLikesカウントがすべて間違っており、会社を1つ追加するたびに増加しているようです. ロジックのどこが間違っているのかわかりません。以前にテストした fbLikes メソッドは (delayed_job に変更する前に) 機能し、「1」がどこから来たのかわかりません...

[出力]

coca-cola
http://www.cocacola.com
Likes: 1  <--- Not sure why the fbLikes is 1 and it increment with second company fbLikes is 2 and so on...

.

[Worker(host:aname.local pid:1400)] Starting job worker
[Worker(host:aname.local pid:1400)] CountJob completed after 0.7893
[Worker(host:aname.local pid:1400)] 1 jobs processed at 1.1885 j/s, 0 failed ...

私はモデルでdelayed_jobを実行していて、Facebookのいいねを数えるジョブを実行しようとしています

これが私のコードです。[lib/count_rb.job]

require 'net/http'
    class CountJob< Struct.new(:fbid)

def perform 
    uri = URI("http://graph.facebook.com/#{fbid}")
    data = Net::HTTP.get(uri)
    return JSON.parse(data)['likes']
end
end

【企業モデル】

before_save :fb_likes
def fb_likes            
    self.fbLikes = Delayed::Job.enqueue(CountJob.new(self.fbId))
end 
4

1 に答える 1

0

問題はから来ています

before_save :fb_likes  
def fb_likes  
  self.fbLikes = Delayed::Job.enqueue(CountJob.new(self.fbId))  
end

enqueue メソッドは、CountJob の実行結果を返しません。ジョブが正常にエンキューされたかどうかが返されると思います。これを fb_likes 値に保存すると、ジョブが正常にエンキューされたときに 1 と評価されます。

エンキュー呼び出しの結果としてではなく、delayed_job によって実行されているジョブ内で fbLikes を設定する必要があります。

before_save :enqueue_fb_likes  
def fb_likes  
  Delayed::Job.enqueue(CountJob.new(self.fbId))  
end

CountJob クラスの perform メソッドは、単に fbId を取得するのではなく、モデル ID を参照して fbId および fbLikes 属性にアクセスできるようにする必要があります。

class CountJob< Struct.new(:id)

def perform
  company = Company.find(id)
  uri = URI("http://graph.facebook.com/#{company.fbid}")
  data = Net::HTTP.get(uri)
  company.fbLikes = JSON.parse(data)['likes']
  company.save
end
于 2012-04-19T16:45:25.960 に答える