【问题标题】:Writing a DelayedJob custom job to run script and then destroy object编写一个 DelayedJob 自定义作业来运行脚本然后销毁对象
【发布时间】:2013-05-09 11:26:09
【问题描述】:

我想了很久,还是想不通。

我在我的 Rails 应用程序中使用 DelayedJob 是为了运行一个脚本来通过 Mechanize 脚本填写网站上的一些表格。但是,在作业完成后,我不希望将条目的任何记录存储在我的应用程序的任何数据库中,因为没有人应该再次访问它。

当我在控制器的create 方法中将它作为一个简单的后台方法运行时,该过程完美运行——也就是说,在if @course.save 之后立即调用@course.delay.scrape。但是现在我想在后台作业完成后立即销毁对象,我相信我需要创建一个自定义作业,并且正在努力解决这个问题。

我知道 DelayedJob 文档列出了方法 def after(job)。为了使用该方法,我需要创建一个自定义作业。我对如何创建自定义作业感到困惑,因为我能找到的几乎每个示例都是用于发送大量电子邮件,而这是出于不同的目的。我不知道如何让脚本以这种方式运行。

如果您能帮助我修复此代码,我们将不胜感激!我尝试了许多变体,尽可能多地查看示例。我知道它至少有一些错误,但还不够先进,不知道要改变什么。这是我在认输之前尝试的最后一件事。

这是我的模型(在 models/course.rb 中):

class Course < ActiveRecord::Base

 after_create :send_to_delayed_job

 def scrape
   ...Mechanize script goes here ....
 end

 def send_to_delayed_job
  Delayed::Job.enqueue CourseJob.new(self.id), :queue => 'mycoursequeue'
 end
end

这是我的工作(在 models/course_job.rb 中):

class CourseJob < Struct.new(:course_id)

 def perform
  course = Course.find(self.id)
  course.scrape
 end

 def after(job)
  Course.destroy(params[:id])
 end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 delayed-job background-process


    【解决方案1】:

    我们可以将course.destroy 作为CourseJob#perform 方法的最后一行吗?

    【讨论】:

    • 感谢您的回复。我继续并在上面澄清了我的问题。这是一个非常好的主意,但不幸的是,我根本无法通过自定义作业使该过程正常工作(尽管它以前通过常规延迟方法工作)。在我弄清楚这一点之前,我无法让记录因此而被破坏。
    • 我可以知道您是如何测试它不适用于自定义 Job 对象的吗?因为在我看来,你的问题很奇怪……
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2017-09-22
    • 2013-01-30
    • 2017-06-29
    • 2012-02-06
    相关资源
    最近更新 更多