Rails 3: Как работает accepts_nested_attributes_for?

Рассмотрим следующую ассоциацию:

class Product < ActiveRecord::Base
  belongs_to :shop
  accepts_nested_attributes_for :shop
end

If

params[:product][:shop_attributes] = {"name" => "My Shop"}

и я делаю:

@product = Product.new(params[:product])
@product.save

новый магазин с именем «Мой магазин» создается и назначается @product, как и ожидалось.

Однако я не могу понять, что происходит, когда shop_attributes содержит некоторые id, например:

params[:product][:shop_attributes] = {"id" => "20", "name" => "My Shop"}

Я получаю следующую ошибку:

Couldn't find Shop with ID=20 for Product with ID=

Вопрос 1

Что это значит?

Вопрос 2

Если это так, т.е. известен id магазина, а магазин с таким id уже существует, как мне создать @product, чтобы этот магазин был закреплен за ним?


person Misha Moroshko    schedule 19.12.2010    source источник


Ответы (1)


Я думаю, что вы пытаетесь выяснить, как создать новый связанный элемент, а не связать с существующим элементом.

Для создания нового элемента у вас, кажется, он работает. Когда вы передали идентификатор в shop_attributes, это не сработало, потому что он ищет ассоциацию, которой еще не существует.

Если вы пытаетесь связать существующий элемент, вы должны использовать следующее:

params[:product][:shop_id] = "20"

Это назначит магазин текущего продукта магазину с идентификатором 'shop_id'. (У продукта должен быть столбец «shop_id».)

person clemensp    schedule 20.12.2010
comment
Есть идеи, как это работает, если у продукта есть несколько магазинов? Нравится params[:product][:shops_attributes] = {"0" => {"id" => "20", "name" => "My Shop"}, "1" => {...}}? Спасибо! - person Cimm; 29.06.2011
comment
Используя методологию params[:product][:shop_id], вы можете: params[:product][:shop_ids] = [20,23,27] - person Michael Lynch; 11.10.2013