Rails 3:"accepts_nested_attributes_for"如何工作?

Mis*_*hko 33 ruby-on-rails nested-attributes ruby-on-rails-3

考虑以下关联:

class Product < ActiveRecord::Base
  belongs_to :shop
  accepts_nested_attributes_for :shop
end
Run Code Online (Sandbox Code Playgroud)

如果

params[:product][:shop_attributes] = {"name" => "My Shop"}
Run Code Online (Sandbox Code Playgroud)

我这样做:

@product = Product.new(params[:product])
@product.save
Run Code Online (Sandbox Code Playgroud)

@product正如预期的那样,创建一个名为"我的商店"的新商店并分配给它.

但是,我无法弄清楚当shop_attributes包含一些内容时会发生什么id,例如:

params[:product][:shop_attributes] = {"id" => "20", "name" => "My Shop"}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Couldn't find Shop with ID=20 for Product with ID=
Run Code Online (Sandbox Code Playgroud)

问题1

这意味着什么?

问题2

如果是这种情况,即id商店已知,并且商店id已经存在,我该如何创建@product这样的商店将被分配给它?

cle*_*nsp 14

我认为您正试图找出创建新关联项目与关联现有项目.

要创建一个新项目,您似乎可以使用它.当你在shop_attributes中传递id时,它不起作用,因为它正在查找一个尚不存在的关联.

如果您尝试与现有项目关联,则应使用以下内容:

params[:product][:shop_id] = "20"
Run Code Online (Sandbox Code Playgroud)

这会将当前产品的商店分配给ID为"shop_id"的商店.(产品应该有'shop_id'列.)

  • 如果产品有多个商店,任何想法如何工作?比如`params [:product] [:shops_attributes] = {"0"=> {"id"=>"20","name"=>"我的商店"},"1"=> {...}} `?谢谢! (7认同)