#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.