我正在尝试从我的文章模型中移出一些与统计相关的列,并创建名为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个统计数据后失败。
执行此大小的操作的最佳实践方法是什么(我不介意一些停机时间,如果我知道它会起作用的话)?
答案 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;
这将比红宝石循环快几个数量级。