2010-12-19 15 views
33

Considérese la siguiente asociación:Rails 3: ¿Cómo funciona "accepts_nested_attributes_for"?

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

Si

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

y yo: se crea y se asigna al @product

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

una nueva tienda con el nombre "Mi Tienda", como se esperaba.

Sin embargo, no puedo imaginar lo que sucede cuando shop_attributes contiene algunos id, como:

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

me sale el siguiente error:

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

Pregunta 1

Qué significa esto ?

Pregunta 2

Si este es el caso, es decir, el id de la tienda se sabe, y la tienda con tanta id ya existen, cómo debo crear el @product tal que se asigna esta tienda a eso ?

Respuesta

14

Creo que está tratando de descubrir la creación de un nuevo elemento asociado frente a la asociación con un elemento existente.

Para crear un nuevo elemento, parece que lo tiene funcionando. Cuando pasaste la identificación en shop_attributes, no funcionó, porque está buscando una asociación que aún no existe.

Si usted está tratando de asociarse con un elemento existente, usted debe estar utilizando la siguiente:

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

Esto asignará la tienda del producto actual a la tienda con id 'shop_id'. (El producto debe tener una columna 'shop_id').

+7

¿Alguna idea de cómo funciona esto si un producto tiene varias tiendas? Como 'params [: product] [: shops_attributes] = {" 0 "=> {" id "=>" 20 "," name "=>" Mi tienda "}," 1 "=> {...}} ¿? ¡Gracias! – Cimm

+1

Usando la metodología 'params [: product] [: shop_id]', puede hacer: 'params [: product] [: shop_ids] = [20,23,27]' –

Cuestiones relacionadas