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
我想启动一项工作,计算我的网络应用程序的每个用户的积分。 这是问题所在,我想用 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