@modernstyle
Code GOD

Почему объект не сохраняется при выполении отложенного метода через Sidekiq?

При создании объекта я хочу чтобы отложенно выполнялись еще несколько методов:

Объект:

after_create :process_offer

  protected

      def process_offer
        BodyWorker.perform_async(self.id)
      end


Воркер:

class BodyWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(offer_id)
    offer = Offer.find(offer_id)

    remove_html(offer)
    offer.publish!
  end

    protected

      def remove_html(offer)
        offer.body = ''
        offer.save
      end


В данном случае я указал очистить body объекта, чтобы не заморачивать вопрос. Тем не менее этот воркер не выполняет метод remove_html, либо выполняет его, но результат не сохраняется, я не пойму почему.
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ответы на вопрос 3
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
Странно, что воркер не вылетает с ошибкой, потому что для вызова воркера после сохранения нужно использовать after_commit а не after_create. В момент, когда вызывается after_create транзакция еще не закончилась и id доступен только в модели.
Ответ написан
@thepry
Ruby on rails, 1С разработчик
Тем не менее этот воркер не выполняет метод remove_html, либо выполняет его, но результат не сохраняется, я не пойму почему.

Залогируйте что возвращает метод save. Может какие-то валидации не позволяют его сохранить*
Ответ написан
Комментировать
@jarosluv
Выложите последние записи из лога Sidekiq (log/sidekiq.log).

Возможно, у объекта в методе remove_html не проходит валидация. Попробуйте использовать bang-метод save!.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы