rails 中如何使用延迟作业进行批量更新的任何示例
any example how to mass update with delayed job in rails
试图了解 Rails 中的 delayed_job,我想更新我图库中已过期的所有 PIN
class UpdatePinJob < ApplicationJob
queue_as :default
def perform(gallery)
gallery.where('DATE(expired_pin) > ?', Date.today).update_all('pin = ?', 'new_pin_here')
end
end
这是使用作业的正确方法吗?以及如何在我的控制器中调用它?
我希望我的问题是有道理的,为什么我在这种情况下使用队列,因为我在想如果我的画廊有几千个,我想更新所有,那是我在想使用 delayed_job 可能有助于这个缩放它:)
如果我的问题有问题抱歉,我在这里试图理解
你走在正确的轨道上。我建议按照此处的说明进行操作:ActiveJobsBasics
要在您的控制器中调用它,您应该这样做:
# Enqueue a job to be performed as soon as the queuing system is free.
UpdatePinJob.perform_later(gallery)
# Enqueue a job to be performed 1 week from now.
UpdatePinJob.set(wait: 1.week).perform_later(gallery)
您应该注意的一件重要事情是实际执行作业。根据 ActiveJob:
For enqueuing and executing jobs in production you need to set up a queuing backend, that is to say you need to decide for a 3rd-party queuing library that Rails should use. Rails itself only provides an in-process queuing system, which only keeps the jobs in RAM. If the process crashes or the machine is reset, then all outstanding jobs are lost with the default async backend. This may be fine for smaller apps or non-critical jobs, but most production apps will need to pick a persistent backend.
我会选择 Sidekiq
别忘了这样做:
# config/application.rb
module YourApp
class Application < Rails::Application
...
config.active_job.queue_adapter = :sidekiq
...
end
end
编辑:如果您对如何安排感兴趣,那取决于您使用的技术。
如果您使用 Heroku 进行部署,则可以使用 Heroku Scheduler。如果您在 Digital Ocean 中部署,您可以使用 Cron Jobs。
试图了解 Rails 中的 delayed_job,我想更新我图库中已过期的所有 PIN
class UpdatePinJob < ApplicationJob
queue_as :default
def perform(gallery)
gallery.where('DATE(expired_pin) > ?', Date.today).update_all('pin = ?', 'new_pin_here')
end
end
这是使用作业的正确方法吗?以及如何在我的控制器中调用它? 我希望我的问题是有道理的,为什么我在这种情况下使用队列,因为我在想如果我的画廊有几千个,我想更新所有,那是我在想使用 delayed_job 可能有助于这个缩放它:) 如果我的问题有问题抱歉,我在这里试图理解
你走在正确的轨道上。我建议按照此处的说明进行操作:ActiveJobsBasics
要在您的控制器中调用它,您应该这样做:
# Enqueue a job to be performed as soon as the queuing system is free.
UpdatePinJob.perform_later(gallery)
# Enqueue a job to be performed 1 week from now.
UpdatePinJob.set(wait: 1.week).perform_later(gallery)
您应该注意的一件重要事情是实际执行作业。根据 ActiveJob:
For enqueuing and executing jobs in production you need to set up a queuing backend, that is to say you need to decide for a 3rd-party queuing library that Rails should use. Rails itself only provides an in-process queuing system, which only keeps the jobs in RAM. If the process crashes or the machine is reset, then all outstanding jobs are lost with the default async backend. This may be fine for smaller apps or non-critical jobs, but most production apps will need to pick a persistent backend.
我会选择 Sidekiq
别忘了这样做:
# config/application.rb
module YourApp
class Application < Rails::Application
...
config.active_job.queue_adapter = :sidekiq
...
end
end
编辑:如果您对如何安排感兴趣,那取决于您使用的技术。 如果您使用 Heroku 进行部署,则可以使用 Heroku Scheduler。如果您在 Digital Ocean 中部署,您可以使用 Cron Jobs。