我有一个表单,我通过它上传图片。工作流程是,我将上传并保存图像,然后运行延迟作业,这将拍摄此图像,并将从中创建3个拇指。
当我刷新页面时,我通常会看到拇指还没有创建,但过了一会儿(10-15秒)就准备好了。
但这不是很友好 - 我想向用户展示他的拇指正在创作,但该怎么做?
delayed_jobs 表的结构如下:
create_table "delayed_jobs", :force => true do |t|
t.integer "priority", :default => 0, :null => false
t.integer "attempts", :default => 0, :null => false
t.text "handler", :null => false
t.text "last_error"
t.datetime "run_at"
t.datetime "locked_at"
t.datetime "failed_at"
t.string "locked_by"
t.string "queue"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
我认为可行的方法是在此表中添加一个列,例如 photo_id ,如果此表中缺少相应的行,那么我会知道拇指已准备就绪。否则在队列中/正在创建。
但是如何将这个额外的列保存到此表中?当我调用延迟方法时,就像这样:
@user.delay.activate!(@device)
如何传递照片的 ID ?
由于
答案 0 :(得分:1)
您可以将作业ID存储在photo_id
(或delayed_jobs
)表中,而不是将photos
存储在users
表中。为此,您需要编写一个Job类,如下所示:
class PhotoThumbnailJob < Struct.new(:user_id)
def perform
# generate the thumbnail
end
end
然后像这样得到对作业实例的引用:
job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id
现在只要你拥有@user就可以获得这份工作。这样你可以判断它是否失败或者还没有完成,如果失败你可以报告原因等。
请注意,如果执行此操作,您可能希望在thumbnail_job_id上创建外键约束,并在删除作业时将其指示为空列,因为默认情况下DJ将从delayed_jobs表中删除成功的作业。
答案 1 :(得分:0)
我在我构建的应用程序中需要类似的功能。我采用的方法是使用WebSockets在我的DelayedJob作业进度时向用户发送状态更新。我使用Pusher,因为API很简单,对我们来说是免费的,但任何实现,包括您自己的实现都可以。
否则,我会远离更改表格,而是利用DelayedJob提供的各种钩子来启用回调功能,让您在工作的不同阶段采取您喜欢的任何操作。