我有一个这样的报告模型: -
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插件来解决使用批量插入的问题。但想知道是否有其他方式/更好的方法来做到这一点。
答案 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