Ruby on rails 如何检测延迟作业当前是否工作?

Ruby on rails 如何检测延迟作业当前是否工作?,ruby-on-rails,ruby,methods,delay,delayed-job,Ruby On Rails,Ruby,Methods,Delay,Delayed Job,我有一个上传图片的表单。工作流程是,我将上传并保存一个图像,然后运行一个延迟作业,该作业将获取该图像并从中创建3个拇指 当我刷新页面时,我通常会看到拇指尚未创建,但过了一段时间(10-15秒)拇指就准备好了 但这不是很友好-我想向用户展示他的拇指正在创建中,但如何做到这一点 延迟的_jobs表的结构如下所示: create_table "delayed_jobs", :force => true do |t| t.integer "priority", :default

我有一个上传图片的表单。工作流程是,我将上传并保存一个图像,然后运行一个延迟作业,该作业将获取该图像并从中创建3个拇指

当我刷新页面时,我通常会看到拇指尚未创建,但过了一段时间(10-15秒)拇指就准备好了

但这不是很友好-我想向用户展示他的拇指正在创建中,但如何做到这一点

延迟的_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
@user.delay.activate!(@device)
job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id
我认为可以在这个表中添加一列,比如photo\u id,如果这个表中缺少相应的行,那么我就知道拇指已经准备好了。否则在队列中/正在创建

但是如何将这个额外的列保存到这个表中呢?当我调用delay方法时,它是这样的:

  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
@user.delay.activate!(@device)
job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id
如何传递照片的ID


谢谢

在我构建的应用程序中,我需要类似的功能。我采用的方法是使用WebSocket在我的延迟作业进行时向用户发送状态更新。我之所以使用它,是因为API非常简单,对我们来说是免费的,但是任何实现,包括您自己的实现,都可以


否则,我将远离更改表,而是利用DelayedJob提供的各种钩子来启用回调功能,使您能够在作业的各个阶段执行任何您喜欢的操作。

而不是将
照片id
存储在
DelayedJobs
表中,您可以将作业id存储在
照片
(或
用户
)表中。为此,您需要编写如下作业类:

class PhotoThumbnailJob < Struct.new(:user_id)

  def perform
    # generate the thumbnail
  end

end
现在只要你有@user,你就可以得到这份工作。这样你就可以知道它是失败了还是还没有完成,如果失败了,你可以报告原因,等等

请注意,如果执行此操作,可能需要在缩略图_job_id上创建外键约束,并在删除作业时告诉它将该列设为null,因为默认情况下,DJ将从延迟的_jobs表中删除成功的作业