2016-12-05 2 views
3

Es gelten folgende ModelleErstellen und Speichern von übergeordneten und untergeordneten Datensätzen bei Bedarf = true?

class Parent 
    has_many :children 
end 
class Child 
    belongs_to :parent, required: true 
end 

Ist es möglich, Eltern und Kinder zur gleichen Zeit zu schaffen?

@parent = Parent.new(valid_attributes) 
@parent.children.build(valid_attributes) 
@parent.save 
@parent.errors.messages 
#=> {:"children.parent"=>["must exist"]} 

Durch Entfernen der required: true kann der Datensatz gespeichert werden. Aber gibt es eine Möglichkeit, Eltern und Kinder zusammen zu retten, während die Eltern noch immer validiert sind?

Antwort

4

Sie können accepts_nested_attributes_for verwenden, die Aktivierung verschachtelter Attribute bei Assoziation ermöglicht das Erstellen des übergeordneten und untergeordneten Elements auf einmal.

Modell parent.rb

class Parent < ActiveRecord::Base 
    has_many :children 

    #enable nested attributes 
    accepts_nested_attributes_for :children 
end 

Modell child.rb

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Erstellen und speichern Sie Ihre Objekt parents_controller.rb

class ParentsController < ApplicationController 

    def new 
    @parent = Parent.new 
    @parent.children.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @parent } 
    end 
    end 

    def create 
     #your params should look like. 
     params = { 
     parent: { 
      name: 'dummy parent', 
      children_attributes: [ 
      { title: 'dummy child 1' }, 
      { title: 'dummy child 2' } 
      ] 
     } 
     } 

     #You can save your object at once. 
     @parent = Parent.create(params[:parent]) 

     #Or you can set object attributes manually and then save it. 
     @parent.name = params[:parent][:name] 
     @parent.children_attributes = params[:parent][:children_attributes] 
     @parent.save 
    end 

end 

Für weitere Informationen: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

+0

Ihr auf dem richtigen Weg, aber die richtige Plural des Kindes ist, Kinder nicht Childs. Dies ist in Schienen wichtig, da es die Biegung durcheinander bringt. Es gibt auch einige Syntaxfehler. – max

+0

Danke @max für den Hinweis, ich habe meine Antwort aktualisiert. Bitte lassen Sie mich wissen, wo ich falsche Syntax verwende? – Satendra

+0

Siehe meine Bearbeitung. Es gab einen Raum zwischen Doppelpunkt und Kindern an zwei Stellen. – max

Verwandte Themen