Heroku Rails控制台中的大型“创建”循环操作失败

时间:2015-05-06 07:23:18

标签: ruby-on-rails heroku

我正在尝试从我的文章模型中移出一些与统计相关的列,并创建名为Statistics的子类,它通过has_many关系包含相同的信息。但是,我有很多需要创建的记录,并且我的当前方法在一小时后通过heroku run rails c在Rails控制台中运行时超时:

Article.where("stats_count IS NOT NULL").each do |c|
  s = Statistic.new(
    :dimension => "total_count", 
    :metric => c.stats_count, 
    :article_id => c.id )
  s.save
end

在开发中工作,但在生产中运行时,大约有90,000篇文章正在尝试循环,并且在创建大约8,500个统计数据后失败。

执行此大小的操作的最佳实践方法是什么(我不介意一些停机时间,如果我知道它会起作用的话)?

1 个答案:

答案 0 :(得分:1)

在分离的一次性dyno上运行代码可能会绕过超时,但在我看来,你在数据库级别这样做会好得多。

从psql控制台(heroku pg:psql)

INSERT INTO statistics (dimension, metric, article_id)
SELECT 'total_count', stats_count, id
FROM articles
WHERE stats_count IS NOT NULL;

这将比红宝石循环快几个数量级。