2016-07-14 2 views
1

у меня есть модель отчета, как это: -Как вставить все вложенные атрибуты в объеме с использованием рельсов активной записи

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. Но хотелось бы знать, есть ли другой способ/лучший способ сделать это.

ответ

0

Пройдя через аналогичный сценарий, для этих типов случаев есть удивительный камень activerecord-import.

report = Report.new(name: params[:name]) 
report.save_with_nested_attributes(report_clients_attributes) 

В 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 

Есть много других способов, упомянутых в gem wiki массовых импорта записей.

Надеюсь, что это поможет!

+0

Спасибо @RSB за вашу помощь. Будет ли валидация для модели отчета работать в этом случае. –

+0

Да, он выполняет проверки, вы можете использовать 'save!' Или добавить вложенные клиенты в 'if save'. Я добавил все в блок 'transaction' для обработки и другие ошибки базы данных. – RSB

+0

Когда я хочу запустить ReportClient.import (report_clients_objects) , он показывает *** Класс создает много без проверок или обратных вызовов *** –

Смежные вопросы