Чтобы упростить наследование 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
Если вы имеете в виду «работника» и «Иова» как взаимозаменяемые слова, тогда это будет выглядеть примерно так? class ExampleJob < ApplicationJobdef perform(record_id)Record.find(record_id).update!(column: new_value)set_paper_trail_whodunnitendend Я попробовал это, и он не записывает whodunnit, поскольку действие выполняется до вызова set_paper_trail_whodunnit, и поэтому yield внутри него не имеет ничего yield, поэтому PaperTrail не может назначить whodunnit имени задания/работника. Извиняюсь за форматирование





Спасибо Максенсу, который дал мне инициативу.
perform в Worker или отдельном задании, как оно упоминается в документации Sidekiq, действительно перезаписывалось любым заданием, наследующим ApplicationJob, что означало, что обратный вызов around_perform никогда не запускался.
Я заглянул в свои рабочие файлы и изменил там методы с perform на perform!, чтобы эти обратные вызовы можно было запускать.
performв родительском классе не выполняется, поскольку дочерний метод уже существует. Может быть, вы можете вызватьset_paper_trail_whodunnitпрямо в файле Worker? Я имею в виду последовательно после того, как вы сделали то, что хотите сделать..