Как оптимизировать запрос вставки рельсов - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над проектом ROR с rails 4, и мне нужно написать задачу rake, чтобы прочитать почтовые индексы из Excel и связать все эти почтовые индексы со сделками.Excel содержит 16 тыс. Почтовых индексов.Итак, для каждой сделки мне нужно создать 16 тыс. Записей в третьей таблице (deal_zipcodes).

Я использую HABTM следующим образом:

class Deal < ActiveRecord::Base
  has_and_belongs_to_many  :zipcodes, dependent: :destroy
end

class Zipcode < ActiveRecord::Base
  has_and_belongs_to_many :deals
end

рейк-задача:

task spectrum_deals: :environment do
    workbook =  Spreadsheet.open(Rails.root.join('public/zip_code_list.xls').to_path).worksheets.first
    deals = Deal.where(service_provider_id: ServiceProvider.where(name:"Spectrum").pluck(:id))
    zipcodes = Zipcode.where(code: workbook.rows.map{|a| a.to_a.first})
    deals.map{|deal| deal.zipcodes.delete_all }
    deals.each do |deal|
      deal.zipcodes << zipcodes
      puts "deal_id: #{deal.id} created"
    end
    puts "===============finished=============="
  end

Эта задача с граблями работает нормально, но в какой-то момент возникает проблема с памятью, и система зависает.Пожалуйста, дайте мне решение, как я могу его оптимизировать.Заранее спасибо.

1 Ответ

0 голосов
/ 23 февраля 2019

Вокруг есть такие замечательные жемчужины, как activerecord-import или bulk_insert , которые упрощают такие вещи, поэтому я настоятельно рекомендую использовать что-то подобное.

...