#ruby-on-rails #postgresql #sidekiq
#ruby-on-rails #postgresql #sidekiq
Вопрос:
class A
....
def something
if condition
mark_completed
// here I can see the object progress is completed
CompletionStatsWorker.perform_async(self.id)
end
end
def mark_completed
self.update_attributes!(progress: 'completed')
end
end
В рабочем:
class CompletionStatsWorker
include Sidekiq::Worker
def perform(id)
obj = A.find(id)
//here I'm getting the progress of the same object as 'progressing'
end
end
Sidekiq каким-то образом извлекает старые данные, даже если они запускаются после успешного обновления поля. Я вижу, что объект updated_at
не совпадает с фактическим updated_at
значением. Пожалуйста, помогите
Ответ №1:
это может произойти из sidekiq
-за того, что работает быстрее, чем передано в БД, вам следует добавить CompletionStatsWorker.perform_async(self.id)
в after_commit
обратный вызов или изменить метод на :
def something
if condition
if mark_completed
// here I can see the object progress is completed
CompletionStatsWorker.perform_async(self.id)
end
end
end
взгляните на документы sidekiq
Комментарии:
1. Привет, Олег, я пробовал оба. Странно то, что прогресс завершен до того, как я вызываю работника. Но внутри рабочего он снова показывает статус как прогрессирующий. Но в db он завершается сам.
2. вы можете попробовать, просто для проверки, после
mark_completed
метода addsleep 1
. Это то же самое в этом случае?