【问题标题】:Rails/delayed job: not able to save model from within delayed jobRails/延迟作业:无法从延迟作业中保存模型
【发布时间】:2012-04-20 09:51:21
【问题描述】:

我有一个 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 ...

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

-- 编辑--

根据 Alex 的建议,我已将代码更新为如下所示(但无济于事):

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

【问题讨论】:

  • 对此有任何答案吗?目前遇到同样的问题...
  • 有什么解决办法吗?有没有更简单的方法来做到这一点?
  • @imderek 你找到这个问题的解决方案了吗?
  • 什么轨道/延迟作业版本?
  • 我在 rails 3.2.7delayed_job 3.0.3 上(delayed_job_active_record 0.3.2)。通过使用 Foreman 启动我的应用程序(通过 Heroku Toolbelt 而不是 Passenger. 我还发现通过典型的touch tmp/restart.txt 重新启动服务器不足以让 DJ 进程获取代码更改;相反,我停止了 Foreman 进程(通过control-c),然后运行再次foreman start。如果有帮助,请+1。

标签: ruby-on-rails delayed-job


【解决方案1】:

其中一个原因可能是当您将方法传递给delay 时,self 未正确序列化。尝试将shorten_urls! 设为一个类方法,该方法接受记录 ID 并从 DB 中获取它。

【讨论】:

  • K,见我上面的编辑。我按照你的建议做了,虽然它违反逻辑,但它仍然没有更新帖子。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 2016-03-29
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多