我有一个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
答案 0 :(得分:1)
当您将方法传递给self
时,其中一个原因可能是delay
未正确序列化。尝试使shorten_urls!
类方法获取记录ID并从DB中获取它。