如何使用rails active record批量插入所有嵌套属性

时间:2016-07-14 08:45:48

标签: ruby-on-rails postgresql ruby-on-rails-4 bulkinsert

我有一个这样的报告模型: -

class Report < ActiveRecord::Base
  has_many :report_clients
  accepts_nested_attributes_for :report_clients, :reject_if => proc { |attributes| attributes['client_id'].blank? },  :allow_destroy => true
end

报告客户端模型就像

class ReportClient < ActiveRecord::Base
  belongs_to :report
end

在创建报告时,我的参数结构将类似于

Report.create({name: params[:name],  report_clients_attributes: [{client_id: 1}, {client_id:2}]})

它将运行1个查询以插入报告,并运行2个查询以插入report_clients。

通常我曾经针对每个报告插入1000个report_clients,导致1000个sql查询。

我知道,我可以通过编写原始sql插件来解决使用批量插入的问题。但想知道是否有其他方式/更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

经历过类似的情况,这类案件有一个很棒的宝石activerecord-import

report.rb

def save_with_nested_attributes(report_clients_attributes) report_clients_objects = [] transaction do save! report_clients_attributes.each do |client_attributes| report_clients_objects << report_clients.new(client_attributes) end ReportClient.import(report_clients_objects) end end

_.minBy

gem wiki中提到了许多其他方法来批量导入记录。

希望有所帮助!

答案 1 :(得分:-1)

您可以按以下方式使用create

Report.create({name: params[:name],  report_clients: report_clients})

其中report_clients定义为

def report_clients
        clients = [{client_id: 1}, {client_id:2}]
        clients.map do |client|
          ReportClient.new(client)
        end
end