2015-06-24 3 views
0

Я думаю, что rake task не является ключевым словом здесь, но я не знаю ключевое слово correct для решения этой проблемы.Рельсы: как возобновить задачу рейка?

articles = Article.all 
    articles.each do |article| 
    get_share(article) #use HTTParty, Nokogiri, etc. 
    if article.save 
     puts "#{article.url}, #{article.share}" 
    end 
    end 

У меня есть этот скрипт, чтобы получить долю числа в URL из Facebook, Twitter и других платформ. Однако иногда цикл прерывается, возможно, мое подключение к интернету сломано, или, может быть, разбор в nokogiri идет не так, или просто artilces слишком много.

Итак, если я снова заведу task, он будет начните с начала, что на самом деле пустая трата времени.

Можно ли забрать его, где остановлен цикл (конкретный article в данном случае), и запустить сценарий оттуда?

Я могу вывести article.id и получить статью, как articles = Article.where(id > stoped_id), но это хорошее решение? или если для этого есть какой-то изящный подход?

ответ

1

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

Супер простой способ - просто прочитать/написать временный файл. например

tempfile = "/tmp/updated_article_ids.txt" 
if File.exists?(tempfile) 
    @updated_ids = File.readlines(tempfile).collect{|l| l.chomp.to_i} 
end 
if @updated_ids.blank? 
    articles = Article.all 
else 
    articles = Article.where(["id not in (?)", @updated_ids]).all 
end 
articles.each do |article| 
    get_share(article) #use HTTParty, Nokogiri, etc. 
    if article.save 
    puts "#{article.url}, #{article.share}" 
    File.open(tempfile, "a"){|f| puts article.id} 
    end 
end 

Если вы знаете, что хотите начать с нуля, удалите временный файл. Или вы могли бы провести еще один тест в коде, чтобы использовать только временный файл, если он меньше, чем один день или что-то еще.

+0

Дополняющий вопрос: как я могу перейти к «статье», если она пошла не так, как с неправильным URL-адресом? И когда «timeout» occrus, возобновляет задачу единственным способом? или я могу снова создать «http-запрос»? – cqcn1991

+1

Оберните его в блок начального спасения http://www.tutorialspoint.com/ruby/ruby_exceptions.htm –

1

Я думаю, что лучше всего реализовать такие задачи, используя какой-то инструмент для этого. Мне лично нравится Delayed Job.

Если вы не желаете делать что-то подобное, вы всегда можете спасти исключение и сделать логику вокруг этого - либо сохранить идентификатор, как вы упомянули, либо сделать какую-то логику повтора повтора сна.

Смежные вопросы