Чтобы упростить наследование Sidekiq::Job
во всех моих заданиях и в качестве попытки использовать встроенные обратные вызовы Rails, я реализовал ApplicationJob
типа это для регистрации whodunnit
данных (я также удалил наследование от ActiveJob::Base
от ApplicationJob
, поскольку это конфликты:
class ApplicationJob
include Sidekiq::Job
extend ActiveModel::Callbacks
sidekiq_options queue: :default
define_model_callbacks :perform
around_perform :set_paper_trail_whodunnit
def set_paper_trail_whodunnit
PaperTrail.request.whodunnit = self.class.name
yield
ensure
PaperTrail.request.whodunnit = nil
end
def perform(*args)
run_callbacks(:perform) do
perform!(*args)
end
end
def perform!(*_args)
raise NotImplementedError, 'Missing your #perform! method implementation'
end
end
Теперь каждое задание должно наследоваться следующим образом, одновременно регистрируя в PaperTrail whodunnit:
class ExampleJob < ApplicationJob
def perform(record_id)
Record.find(record_id).update!(column: new_value)
end
end
Однако в конечном итоге обратный вызов around_perform
никогда не достигается, никогда не срабатывает и, как следствие, whodunnit
никогда не устанавливается должным образом.
Я попытался вручную наследовать around_perform
в ApplicationJob
через:
extend ActiveJob::Callbacks
или через:
extend ActiveJob::Callbacks::ClassMethods
Но это тоже никогда не срабатывает. Или достигается, когда я включаю точку останова внутри set_paper_trail_whodunnit
🤔 А знаете ли вы, что...
Ruby on Rails предоставляет множество готовых решений для обработки типичных задач, таких как маршрутизация и работа с базой данных.
Спасибо Максенсу, который дал мне инициативу.
perform
в Worker или отдельном задании, как оно упоминается в документации Sidekiq, действительно перезаписывалось любым заданием, наследующим ApplicationJob, что означало, что обратный вызов around_perform
никогда не запускался.
Я заглянул в свои рабочие файлы и изменил там методы с perform
на perform!
, чтобы эти обратные вызовы можно было запускать.