2016-05-23 4 views
1

Ich wollte kopieren und Masseneinfügung Daten in der Datenbank (mit bulk_insert GEM), so habe ich versucht, die folgende:Masseneinsatz von Daten in Schienen DB mit den Verbänden

@questionnaires = Questionnaire.where(:id => params[:id]) 
@new_sections = [] 

@questionnaires.includes(:sections, :questions).each do |questionnaire| 
    questionnaire.sections.each do |section| 
    s = section.dup 
    s.questionnaire_id = nil 
    new_section = Section.new(s.attributes.reject{|k, v| ["id", "created_at", "updated_at"].include?(k)}) 
    questions = [] 

    section.questions.each do |question| 
     q = question.dup 
     q.section_id = nil 
     questions << q.attributes.reject{|k, v| ["id", "created_at", "updated_at"].include?(k)} 
    end 

    new_section.questions.build(questions) 
    @new_sections << new_section 
    end 
end 

Nun, hier @new_sections verfügt über alle Abschnitte mit zugehörigem Fragen, aber wird nicht gespeichert.

SPAREN

Section.transaction do 
    Section.bulk_insert values: @new_sections.map(&:attributes) 
end 

Aber das spart nur die Abschnitte, aber es ist Assoziationen nicht. Wie kann ich auch Assoziationen (Fragen) speichern?

EDIT

Nun kam ich auf dieses https://github.com/zdennis/activerecord-import/wiki GEM und ich versuche, das Multi-Level-Beispiel, immer noch Fragen werden nicht gespeichert. Irgendwelche Ideen?

Antwort

0

Ich glaube, Sie müssen ActiveRecord :: NestedAttributes aktivieren (siehe: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html als Referenz).

Danach müssen Sie

section.questions 

in

section.questions_attributes 

und fügen

accepts_nested_attributes_for :questions 

in Abschnitt Modell ändern

Beachten Sie, ich bin nicht ganz sicher, wie würde es w ork mit dem Einfügen vorhandener Fragen als Assoziation.

+0

Ich habe es schon ;-) – Abhi

+0

@Abhi haben Sie das Problem bereits gelöst? Oder haben Sie NestedAttributes aktiviert? Haben Sie sich bei letzterem den Array-Namen 'questions_attributes' anstelle von' questions' angesehen? Wenn der ehemalige, bitte schließen Sie die Frage/akzeptieren Sie die Antwort/posten Sie Ihre eigene Lösung? – Negnar