Rails:如何恢复rake任务?

时间:2015-06-24 16:08:58

标签: ruby-on-rails

我认为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

我有这个脚本来获取FacebookTwitter和其他平台的网址份额。但是,有时循环中断,可能是我的互联网连接中断,或者nokogiri中的解析出错,或者只是artilces过多。

所以,如果我再次运行task,它将从头开始,这实在是浪费时间。

是否可以让它在循环停止的地方(在这种情况下是特定的article),并从那里开始脚本?

我可以输出article.id,并获得像articles = Article.where(id > stoped_id)这样的文章,但这是一个很好的解决方案吗?或者如果有任何优雅的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为最好使用某种工具来实现此类任务。我个人喜欢Delayed Job

如果你不喜欢做那样的事情,你总是可以拯救异常并围绕它做逻辑 - 保存你提到的id,或者做一些睡眠重试逻辑。

答案 1 :(得分: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

如果您知道要从头开始,请删除临时文件。或者,你可以在代码中进行进一步的测试,只使用tempfile不到一天或者其他东西。