我认为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
我有这个脚本来获取Facebook
,Twitter
和其他平台的网址份额。但是,有时循环中断,可能是我的互联网连接中断,或者nokogiri
中的解析出错,或者只是artilces
过多。
所以,如果我再次运行task
,它将从头开始,这实在是浪费时间。
是否可以让它在循环停止的地方(在这种情况下是特定的article
),并从那里开始脚本?
我可以输出article.id
,并获得像articles = Article.where(id > stoped_id)
这样的文章,但这是一个很好的解决方案吗?或者如果有任何优雅的方法吗?
答案 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不到一天或者其他东西。