Heroku Rails 控制台中的大型 'create' 循环操作失败

Large 'create' loop operation failing in Heroku Rails console

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

时,我当前的方法在一小时后超时
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 个统计信息后失败了。

执行这种规模的操作的最佳实践方法是什么(我不介意停机,如果我知道它会起作用的话)?

有可能 运行 您在独立的一次性测功机上编写代码会绕过超时,但在我看来,您最好在数据库级别执行此操作。

来自 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;

这将比 ruby 循环快几个数量级。