在Heroku上运行长轨控制台或rake任务

问题描述 投票:0回答:2

我的rails应用程序托管在Heroku上。我正在尝试通过简单的循环处理Postgresql DB中的数据

  DocumentText.all.each do |t|
    if is_number? t.src
      puts t.src
      t.targ = t.src
      t.save
    end
  end

我的问题是我的Rails控制台在浏览了一些记录(不是全部记录)后将退出。

为什么会这样,我有什么选择?

ruby-on-rails heroku console heroku-postgres rake-task
2个回答
1
投票

在您的代码段中,您正在对数据库运行n个更新查询,这将花费很多时间,这就是为什么您的任务未完全运行的原因。

我建议对数据库运行一个更新查询。为此,请在您的Gemfile中添加以下gem []

gem 'activerecord-import'

documents = []
DocumentText.all.each do |t|
  documents << t if is_number?(t.src)
end


# MySQL version
Book.import(documents, on_duplicate_key_update: {targ: :src})

# PostgreSQL version (no shorthand version)
Book.import([book], on_duplicate_key_update: {
  conflict_target: [:id], columns: {targ: :src}
})

这应该可以解决问题。如果您有数百万个数据,那么我还建议分批运行此过程。让我知道您是否需要帮助。


0
投票

@@ Pradeep Agrawal的答案使我找到了使用activerecord-import gem的解决方案(他的答案是从gem复制并粘贴并包含错误)。

© www.soinside.com 2019 - 2024. All rights reserved.