架构问题-刮刮任务放在哪里

时间:2019-04-02 15:35:56

标签: ruby-on-rails model rake

我目前正在构建一个应用程序,该应用程序将每天简单地访问一个网站,并将该网站的特定表上的信息保存到我设置的数据库中。我目前在模型上创建了一个类方法来完成抓取。我创建的rake任务每天调用一次class方法。

虽然我的代码“有效”并且我每天收集一次信息,但我感到有些奇怪,将刮取的逻辑留在了模型中,并对是否有更好的方法完成此任务感到好奇。

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

2 个答案:

答案 0 :(得分:1)

Sidekiq工作人员往往工作得很好(双关语意),尤其是在循环的情况下,您可以从其他主要工作人员中派生其他工作人员,以提高性能并更容易捕获错误

例如

class HardWorker
  include Sidekiq::Worker

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

答案 1 :(得分:0)

更好的方法是使它成为ActiveJob作业,即使仅使用YourTask.perform_now中的rails runner来调用它也不需要任何后台工作。

它将允许您分离逻辑,而且活动任务比耙任务更容易测试。