现在如何执行后台工作?

时间:2017-05-02 11:20:57

标签: ruby-on-rails delayed-job rails-activejob

我想在后台执行此操作

Product.all.map { |product| product.save }

当我保存产品时,将调用回调以在产品成本的表格中创建新记录

我为此创建了一个作业,但是如果我执行perform_now,它就不会在后台执行,并且perform_later会在很久之后执行。

我想立即执行此操作,但在后台执行。我不确定我是否也可以在一个线程中执行它。

我正在使用延迟工作,这是工作

class UpdateProductCostsJob < ApplicationJob
  queue_as :default

  def perform
    Product.all.map { |product| product.save }
  end
end

我希望每次保存此模型时执行

class CostComposition < ApplicationRecord
  before_save :update_product_costs

  private

    def update_product_costs
      UpdateProductCostsJob.perform_now
    end
end

1 个答案:

答案 0 :(得分:1)

假设您使用的是rails 5,您可以创建一个高优先级队列并在该队列下创建作业。如果只有一个队列,则可以将作业添加到队列中,并指定处理该作业的时间。

UpdateProductCostJob.set(wait_until: Time.now + 5.minutes).perform_later

参考http://edgeguides.rubyonrails.org/active_job_basics.html#enqueue-the-job