我正在使用 Sidekiq 來處理sidekiq-status和sidekiq-entgems 的延遲作業。我創建了一個作業人員,負責將minor狀態更新到false用戶是adult和擁有minor: true. 這個工人應該每天在美國東部時間午夜被解雇。像下面這樣:
#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
在通過 sidekiq 啟動后bundle exec 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
uj5u.com熱心網友回復:
由于這是類方法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
uj5u.com熱心網友回復:
我認為您需要自己做update_all或update每條記錄,如下所示:
User.adults.where(minor: true).update_all(minor: false)
或者
class MinorWorker
include Sidekiq::Worker
def perform
users = User.adults.where(minor: true)
users.each { |user| user.remove_minor_status }
rescue => e
Rails.logger.error("Unable to update minor field. Exception: #{e.message} : #{e.backtrace.join('\n')}")
end
end
您可能還想考慮更改update為,update!以便如果您rescue在作業中未能發現它會引發錯誤:
def self.remove_minor_status
update!(minor: false)
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390883.html
上一篇:什么相當于rails7中的“Rails.config.action_view.raise_on_missing_translations”?
下一篇:為不同的組分配方案分配標簽
