Вопрос архитектуры — Куда поместить задачу очистки

#ruby-on-rails #model #rake

#ruby-on-rails #Модель #грабли

Вопрос:

В настоящее время я создаю приложение, которое будет просто посещать веб-сайт каждый день и сохранять информацию из определенной таблицы этого сайта в базе данных, которую я настроил. В настоящее время я создал метод класса в своей модели для завершения очистки. Задача очистки, которую я создал, вызывает метод класса один раз в день.

Хотя мой код «работает», и я собираю информацию один раз в день, я чувствую себя несколько странно, оставляя логику очистки в моей модели, и мне любопытно, есть ли предпочтительный способ выполнить эту задачу.

 class WebTable < ApplicationRecord


    def self.scrape_and_save_table_information
        doc = Nokogiri::HTML(open('https://www.calottery.com/play/scratchers-games/top-prizes-remaining'))
        rows = doc.css("tbody tr")
        rows.each do |row|
            row_object = {}
            row_object["cell_one"] = row.children[1].children[0].to_s
            row_object["cell_two"] = row.children[2].children[0].children.to_s
            row_object["cell_three"] = row.children[7].children[0].children[0].to_s
            @table = WebTable.create(row_object)

        end
    end

end

  

Моя задача очистки выглядит следующим образом:

 desc 'scraping webpages'
task scrape_web_pages: :environment do
    daily_prize_scrape = WebTable.scrape_and_save_table_information
end
  

Ответ №1:

Рабочие Sidekiq, как правило, работают довольно хорошо (каламбур), и особенно в случае циклов вы можете создавать других рабочих из одного основного рабочего, для повышения производительности и упрощения обнаружения ошибок

например.

 class HardWorker
  include Sidekiq::Worker

  def perform
    ['nice', 'rows'].each do |row|
      OtherWorker.perform_async(row)
    end
  end
end
  

Комментарии:

1. Потрясающее спасибо — я раньше не слышал о Sidekiq workers, я проверю их!

2. Они, безусловно, полезны! Для всех видов фоновых задач

Ответ №2:

Лучший способ — сделать это заданием ActiveJob, даже если вы собираетесь вызывать его без каких-либо фоновых рабочих элементов, просто с помощью YourTask.perform_now from rails runner .

Это позволит вам разделить логику, также activejobs легче тестировать, чем задачи rake.