如何优化Rails插入查询

时间:2019-02-22 18:19:59

标签: ruby-on-rails spreadsheet

我正在使用Rails 4进行ROR项目,我必须编写一个rake任务以从excel中读取邮政编码,并将所有邮政编码与交易绑定。 Excel包含16k邮政编码。因此,对于每笔交易,我必须在第三张表(deals_zipcodes)中创建16k条记录。

我正在使用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

rake任务:

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

此rake任务工作正常,但有时会引发内存问题,并且系统挂起。 请向我提供解决方案,我该如何对其进行优化。 提前致谢。

1 个答案:

答案 0 :(得分:0)

activerecord-importbulk_insert之类的奇妙宝石使这些事情变得很简单,我强烈建议您使用类似的东西。