Ruby on Rails的 - 通过推迟任务
问题描述:
怪异的行为逻辑,我由TOBI做delayed_job的,当我运行的delayed_job但fbLikes算全错,它似乎我每增加一个公司的时间递增。不确定逻辑错误。该fbLikes方法我之前测试和它的工作(之前我改的delayed_job) 不知道这里的“1”从何而来?Ruby on Rails的 - 通过推迟任务
[输出]
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
答
问题从
before_save :fb_likes
def fb_likes
self.fbLikes = Delayed::Job.enqueue(CountJob.new(self.fbId))
end
传来的排队方法将不会返回运行CountJob结果。我相信无论工作是否成功排队,以及何时将其保存到fb_likes值,它将在作业成功排队时评估为1。
你应该正在由delayed_job的运行还不如排队调用的结果工作内部设置fbLikes。
before_save :enqueue_fb_likes
def fb_likes
Delayed::Job.enqueue(CountJob.new(self.fbId))
end
你执行的CountJob类可能应该采取ID型方法,为您查找并有机会获得FBID和fbLikes属性,而不是仅仅采取FBID。
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
您好,感谢您的答复。我不可能找到公司ID,因为它目前还没有保存。所以我不能使用company.find(id)来指定搜索。 – 2012-04-19 23:26:26
任何想法如何解决此事? – 2012-04-21 11:41:21
如果您在保存之前必须有相同的计数,那么我不确定使用后台作业对您来说是最合适的。后台作业是用于处理需要很长时间的事情,并且不需要立即完成,以便正确处理请求/操作。 – jalvarado 2012-05-01 15:50:19