ruby-on-rails - Rails 5 - Sidekiq 工作人员显示工作已完成,但没有任何反应

标签 ruby-on-rails ruby sidekiq

我正在使用 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/

相关文章:

ruby-on-rails - 140个字符,是字符串还是文本?

javascript - 使用 ruby​​ 在 js 文件中使用来自 localhost 的 json 数据

ruby-on-rails - Sidekiq 仅在生产环境中重试

ruby 正则表达式 split 困难,关闭但不完全

ruby-on-rails - 使用 ActiveJob,perform_now 的结果似乎与 perform_later 不同

ruby-on-rails - ActiveJob + Sidekiq 6.0.3 : How to write to a log file?

ruby-on-rails - Rails - 如何在文本字段中执行 If 和 else 语句

ruby-on-rails - Rails Rspec 错误 - #<RSpec::Core::ExampleGroup::Nested_3:0...> 未定义局部变量或方法

ruby-on-rails - 具有聚合数据的 Rails 模型(不由表支持)

arrays - Ruby——通过键将子数组的值添加到数组中