Sidekiq Job - 如何启动作业并每次更改使用的参数?

Sidekiq Job - How can I launch a job and each time change the parameter used?

我想启动一项工作,计算我的网络应用程序的每个用户的积分。 这是问题所在,我想用 sidekiq-scheduler 自动启动它。 但我很难理解我如何才能带着一个即将改变的论点开始我的工作。我的意思是我必须计算每个用户的点数,因此参数将发生变化并采用不同的 user_id.

这是我的代码:

class PointsjoueurJob < ApplicationJob
  queue_as :default
  def perform(user_id)
@user = User.find(user_id)
    @playerseason = PlayerSeason.where(user_id: @user.id)
    @forecasts = Forecast.where(player_season_id: @playerseason)
     points = []
     @forecasts.each do |forecast|
       if forecast.points_win.present? || forecast.points_lose.present?
         if forecast.points_win.present?
           points << forecast.points_win
         else forecast.points_lose.present?
           points << forecast.points_lose
         end
         @playerseason.update(number_of_points: points.sum)
       else
       end
     end
 end

现在如果我想启动它,我必须转到我的控制台然后输入:

PointsjoueurJob.perform_now(1)

但我想用 sidekiq-scheduler 安排这个。目标是每天 01:00 触发工作(cron:'0 1 * * *')但我不知道如何设置参数以使工作遍历所有用户。

提前致谢。

假设您想要重新计算所有用户的总计,您可以创建一个单独的 'wrapper' 作业,该作业已安排,然后将各个重新计算作业排入队列:

class RecalcPointsJob < ApplicationJob
  queue_as :default

  def perform
    User.find_each do |u|
      PointsjoueurJob.perform_later(u.id)
    end
  end
end

如果您是在寻找一部分用户,请替换为 User.where()User.find_by()

您可以生成任务并使用 whenever,然后进行设置。
在任务上你可以这样写:

rails g task test cron

namespace :test do
  task :cron do
    User.find_each do |u|
      PointsjoueurJob.perform_async(u.id)
    end
  end
end

然后在 config/schedule.rb 安装后 whenever

every '0 1 * * *' do
  rake "test:cron"
end

然后

whenever --update-crontab