如何在需要 = true 时建立和保存父子记录?

And*_*vey 5 ruby-on-rails

鉴于以下模型

class Parent
  has_many :children
end
class Child
  belongs_to :parent, required: true
end
Run Code Online (Sandbox Code Playgroud)

是否可以同时创建 Parent 和 Children?

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

删除required: true允许记录保存。但是有没有办法让父母和孩子一起被保存,同时仍然验证父母的存在?

Sat*_*dra 6

您可以使用 accepts_nested_attributes_for,在关联上启用嵌套属性允许您一次性创建父项和子项。

模型父.rb

class Parent < ActiveRecord::Base
  has_many :children

  #enable nested attributes
  accepts_nested_attributes_for :children
end
Run Code Online (Sandbox Code Playgroud)

模型儿童.rb

class Child < ActiveRecord::Base
  belongs_to :parent
end
Run Code Online (Sandbox Code Playgroud)

构建并保存您的对象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
Run Code Online (Sandbox Code Playgroud)

更多信息:http : //api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html