Gem delayed_job 中怎么 delay 掉 each 方法

zhbinx · 2013年02月27日 · 最后由 doitian 回复于 2013年03月01日 · 2689 次阅读
@service =  Service.all
@service.first().delay.update_attributes(params['xxx'])

以上这样是可以的

@service =  Service.all
@service.delay.each do |s|
    s.update_attributes(params['xxx'])
end

这样这个 deley 就是把@service遍历了下,但是根本没做下面的 update_attributes

请问这样我该怎么解决呢

你传个 block 过去要 delay,里面还包含了外部引用的变量,这显然不可能啊,封装到另外一个方法吧

#1 楼 @ShiningRay 哦,其实没变量的,这个只是我稍微举下例子,没想到乌龙了…… 封装的另外的方法是指什么样呢?这样么

def fun1
    self.delay.fun2
end
def fun2
    @service =  Service.all
    @service.each do |s|
        s.update_attributes(params['xxx'])
    end
end

我感觉我这样写应该是错的……

def fun1
    self.delay.fun2
end
def fun2
    @service =  Service.all
    @service.each do |s|
        s.update_attributes(params['xxx'])
    end
end

#2 楼 @zhbinx 果然。can't dump anonymous module: #<Module:0xa71de28>,错在self.delay.fun2这句话

#4 楼 @zhbinxdelay 的话 delay 方法的 callee 必须是可序列化的。貌似你直接把这两方法放到匿名模块里去了。可以直接 enqueue 一个实现了 perform 方法的可序列化对象。

class ServiceUpdateJob
  def perform
    Service.find_each do |s|
      ...
    end
  end
end

Delayed::Job.enqueue ServiceUpdateJob.new

https://github.com/collectiveidea/delayed_job#custom-jobs

#5 楼 @doitian 我这样做了还报错,能不能帮我看看,谢谢 1.我在/lib 文件夹下加了delay_check.rb

class DelayCheck < Struct.new(:services)
  def perform
    services.each do |service|
      begin
        response = HTTParty.get(service.url)
        response_code = response.code
      rescue
        response_code = 0
      end
      service.update_attributes(:return_code => response_code)
    end
  end
end

2.在页面对应的 action 中有如下方法

def all
  @services =ServiceCheck.all
  Delayed::Job.enqueue(DelayCheck.new(@services))
  flash[:notice] = 'xxxxxxxx'
  redirect_to service_checks_path
end

执行 all 操作的时候还是报 uninitialized constant ServiceChecksController::DelayCheck 我是照这个地址做的http://asciicasts.com/episodes/171-delayed-job

#5 楼 @doitian 额,我把delay_check.rb移到 app/models 下面就好了,能跑了。。。没事了,谢谢你之前的帮助

不要把 active record 的对象直接放进去。最好传 ID,然后在 DelayCheck 里从数据库去取。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号