我有一个 Post 模型(如下),它有一个回调方法可以通过延迟作业修改 body 属性。如果我删除“延迟”。只需执行#shorten_urls!立即,它工作正常。但是,从延迟作业的上下文来看,它不会保存更新的正文。

class Post < ActiveRecord::Base
  after_create :shorten_urls

  def shorten_urls
    delay.shorten_urls!
  end

  def shorten_urls!
    # this task might take a long time,
    # but for this example i'll just change the body to something else
    self.body = 'updated body'
    save!
  end
end

奇怪的是,作业的处理没有任何问题:
[Worker(host:dereks-imac.home pid:76666)] Post#shorten_urls! completed after 0.0021
[Worker(host:dereks-imac.home pid:76666)] 1 jobs processed at 161.7611 j/s, 0 failed ...

然而, body 没有更新。有谁知道我做错了什么?

- 编辑 -

根据亚历克斯的建议,我已将代码更新为如下所示(但无济于事):
class Post < ActiveRecord::Base
  after_create :shorten_urls

  def self.shorten_urls!(post_id=nil)
    post = Post.find(post_id)
    post.body = 'it worked'
    post.save!
  end

  def shorten_urls
    Post.delay.shorten_urls!(self.id)
  end
end

最佳答案

原因之一可能是当您将方法传递给 selfdelay 未正确序列化。尝试使 shorten_urls! 成为一个类方法,它接受记录 ID 并从数据库中获取它。

关于ruby-on-rails - Rails/延迟作业 : not able to save model from within delayed job,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10049230/

10-16 03:52