我正在使用 Sidekiq 来处理 sidekiq-status
的延迟作业和sidekiq-ent
gem 。我创建了一个负责更新 minor
的工作人员状态为false
当用户是adult
时并且有minor: true
。该 worker 应该在东部时间每天午夜被解雇。如下所示:
#initializers/sidekiq.rb
config.periodic do |mgr|
# every day between midnight 0 5 * * *
mgr.register("0 5 * * *", MinorWorker)
end
#app/workers/minor_worker.rb
class MinorWorker
include Sidekiq::Worker
def perform
User.adults.where(minor: true).remove_minor_status
rescue => e
Rails.logger.error("Unable to update minor field. Exception: #{e.message} : #{e.backtrace.join('\n')}")
end
end
#models/user.rb
class User < ApplicationRecord
scope :adults, -> { where('date_of_birth <= ?', 18.years.ago) }
def self.remove_minor_status
update(minor: false)
end
end
不,我想在我的本地计算机上检查这一点 - 为此,我使用 gem 'timecop'
时间旅行:
#application.rb
config.time_zone = 'Eastern Time (US & Canada)'
#config/environments/development.rb
config.after_initialize do
t = Time.local(2021, 12, 21, 23, 59, 0)
Timecop.travel(t)
end
通过 bundle exec sidekiq
启动 sidekiq 后和bundle exec rails s
我等了一会儿,我看到工作人员出现了:
2021-12-21T22:59:00.130Z 25711 TID-ovvzr9828 INFO: Managing 3 periodic jobs
2021-12-21T23:00:00.009Z 25711 TID-ovw69k4ao INFO: Enqueued periodic job SettlementWorker with JID ddab15264f81e0b417e7dd83 for 2021-12-22 00:00:00 +0100
2021-12-21T23:00:00.011Z 25711 TID-ovw69k4ao INFO: Enqueued periodic job MinorWorker with JID 0bcd6b76d6ee4ff9e7850b35 for 2021-12-22 00:00:00 +0100
但它没有做任何事情,用户的次要状态仍然设置为minor: true
:
2.4.5 :002 > User.last.date_of_birth
=> Mon, 22 Dec 2003
2.4.5 :001 > User.last.minor
=> true
我错过了什么吗?
编辑
当我尝试调用 rails c
给这位工作人员打电话时,我必须补充一点。一切正常。我什至有一个 RSpec 测试也通过了:
RSpec.describe MinorWorker, type: :worker do
subject(:perform) { described_class.new.perform }
context 'when User has minor status' do
let(:user1) { create(:user, minor: true) }
it 'removes minor status' do
expect { perform }.to change { user1.reload.minor }.from(true).to(false)
end
context 'when user is adult' do
let(:registrant2) { create(:registrant) }
it 'not change minor status' do
expect(registrant2.reload.minor).to eq(false)
end
end
end
end
最佳答案
由于这是类方法update
将不起作用
def self.remove_minor_status
update(minor: false)
end
利用 #update_all
def self.remove_minor_status
update_all(minor: false)
end
此外,我认为最好的做法是有一些测试用例来确保方法的工作。
到目前为止,您可以从 rails console
尝试此方法并验证它们是否确实有效
test "update minor status" do
user = User.create(date_of_birth: 19.years.ago, minor: true)
User.adults.where(minor: true).remove_minor_status
assert_equal user.reload.minor, false
end
关于ruby-on-rails - Rails 5 - Sidekiq 工作人员显示工作已完成,但没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70452119/