Запуск длинной консоли rails или задача rake на Heroku

Мое приложение rails размещено на Heroku. Я пытаюсь обработать данные в своей базе данных postgresql с помощью простого цикла

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

У меня проблема в том, что моя консоль rails выйдет после просмотра некоторых моих записей (не всех). Я пробовал это как задачу rake, но та же проблема.

Почему это происходит и каковы мои варианты?


person echan00    schedule 31.05.2020    source источник


Ответы (2)


В вашем фрагменте кода вы выполняете n запросов на обновление базы данных, что займет много времени, и поэтому ваша задача не выполняется полностью.

Я бы предложил запустить один запрос на обновление базы данных. Для этого добавьте следующий гем в свой Gemfile

gem 'activerecord-import'

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


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

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

Это должно сработать. Если у вас есть данные в миллионах, я бы также рекомендовал запускать этот процесс в пакетном режиме. Дайте мне знать, если вам нужна помощь с этим.

person Pradeep Agrawal    schedule 31.05.2020

Ответ @Pradeep Agrawal привел меня к решению с использованием драгоценного камня activerecord-import (его ответ был скопирован и вставлен из драгоценного камня и содержал ошибки).

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

DocumentText.import(documents, on_duplicate_key_update: {
  conflict_target: [:id], columns: {targ: :src}
})
person echan00    schedule 01.06.2020