Sidekiq не выполняет задание

Я впервые использую sidekiq для выполнения запланированных действий в Rails 4. Я создал метод выполнения для поиска пустых hashtagable_id и удаления их из базы данных. Я получаю сообщение об ошибке ниже, когда пытаюсь запустить задание с помощью API для консоли Rails.

remove_hashtag_orphans.rb

from -e:1:in `load'
    from -e:1:in `<main>'>> RemoveHashtagOrphans.new.perform(hashtaggable_id)
NameError: undefined local variable or method `hashtaggable_id' for main:Object

Содержимое файла вакансий приведено ниже.

 class RemoveHashtagOrphans < ActiveJob::Base
      queue_as :default

      def perform(hashtaggable_id)
        #Needs argument 
        orphans = SimpleHashtag::Hashtag.all.select {|h| h.hashtaggables.size == 0}
        orphans.map(&:destroy)
      end
    end

    RemoveHashtagOrphans.new.perform(hashtaggable_id)

Оригинальный метод без помощника таков.

def self.clean_orphans
  # Needs refactoring to call a single SQL query
  orphans = self.all.select { |h| h.hashtaggables.size == 0 }
  orphans.map(&:destroy)
end

person RailzWithLove2035    schedule 26.04.2016    source источник
comment
с кодом, который вы пытаетесь запустить в консоли rails - ошибка на самом деле не исходит из вашего метода. Вам нужно определить hashtaggable_id, прежде чем передавать его в качестве аргумента.   -  person max pleaner    schedule 26.04.2016
comment
Что было бы лучшим подходом к преобразованию метода внизу в работу? Я должен найти 1-й hashtaggable_id, посмотреть, к какому из них подключено ноль уникальных хэштегов (hashteggables), а затем уничтожить все.   -  person RailzWithLove2035    schedule 26.04.2016
comment
Ну, на самом деле я не очень разбираюсь в Sidekiq (я сам использовал Resque, хотя и не говорю, что он лучше), но я думаю, что у вас есть доступ к вашему соединению с БД и приложению Rails из фонового задания. Таким образом, не должно быть никаких причин для его рефакторинга, кроме как обернуть его в метод sidekiq.   -  person max pleaner    schedule 26.04.2016
comment
Из того, что я вижу, вам нужен аргумент для работы метода execute. Я просто не могу вписать этот метод в контекст блока выполнения.   -  person RailzWithLove2035    schedule 26.04.2016


Ответы (1)


RemoveHashtagOrphans.new.perform(hashtaggable_id) создаст экземпляр и выполнит задание прямо в процессе. Используйте RemoveHashtagOrphans.perform_later(hashtaggable_id), чтобы отправить задание в Sidekiq.

Ваш код не работает, потому что у вас есть неопределенная переменная:

hashtaggable_id = 10
RemoveHashtagOrphans.new.perform(hashtaggable_id)
person Mike Perham    schedule 26.04.2016
comment
Да, я пытаюсь проверить, работает ли он с new.perform. После этого я собирался использовать метод Perform_later для производства [RemoveHashtagOrphans.perform_at(1.month.from_now)]. Это просто не работает, потому что hashtaggable_id рассматривается как неопределенный метод. - person RailzWithLove2035; 26.04.2016
comment
Это потому, что этой переменной не существует. Смотрите обновление. - person Mike Perham; 26.04.2016
comment
Как бы вы передали все записи из таблицы simple_hashtag_hashtaggeds в метод execute. Я не обязательно хочу искать конкретный идентификатор, но найти все. Нужен ли методу execute аргумент. Могу ли я использовать хэштеги def Perform = SimpleHashtag::Hashtag.all? .... конец Если я могу найти все hashtaggable_id в таблице, а затем выполнить действие. Это сработает. - person RailzWithLove2035; 26.04.2016
comment
Я пытался использовать созданный вами метод, но он не работает, так как hashtags.all.select уже является частью метода. - person RailzWithLove2035; 26.04.2016
comment
Если вы просто хотите запустить clean_orphans в фоновом режиме с помощью Sidekiq, вызовите Foo.delay.clean_orphans вместо Foo.clean_orphans. - person Mike Perham; 26.04.2016
comment
Когда я попробовал это в консоли. Я получил SimpleHashtag::Hashtag.delay.clean_orphans 8e3edab35a4c72071ec92ece -- внутри терминала Sidekiq. Он говорит 2016-04-26T20:03:00.463Z 10508 TID-n997c Sidekiq::Extensions::DelayedClass JID-8e3edab35a4c72071ec92ece INFO: start 2016-04-26T20:03:00.656Z 10508 TID-n997c Sidekiq::Extensions::DelayedClass JID-8e3edab35a4c72071ec92ece JID-8e3edab35a4c72071ec92ece ИНФОРМАЦИЯ: сделано: 0,193 сек Как добавить к нему месячный таймер. Perform_at(1.month.from.now). Когда я обращаюсь к методу, он не может найти Perform_at. - person RailzWithLove2035; 26.04.2016
comment
self.delay_for(1.month).clean_orphans - person Mike Perham; 27.04.2016
comment
Хорошо, я поместил логику в файл модели для хэштега. Спасибо за помощь мне. - person RailzWithLove2035; 27.04.2016