2010-12-19 15 views
33

Si consideri il seguente associazione:Rails 3: Come funziona "accept_nested_attributes_for"?

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

Se

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

e lo faccio:

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

un nuovo negozio con il nome "My Shop" viene creato e assegnato al @product, come previsto.

Tuttavia, non riesco a capire cosa succede quando shop_attributes contiene alcune id, come:

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

ottengo il seguente errore:

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

Domanda 1

Cosa significa questo ?

Domanda 2

Se questo è il caso, cioè la id del negozio è noto, e il negozio con tale id già esistono, come devo creare il @product in modo tale che questo negozio sarà assegnato a vero?

risposta

14

Penso che si stia cercando di capire come creare un nuovo oggetto associato rispetto all'associazione con un articolo esistente.

Per creare un nuovo elemento, sembra che funzioni. Quando hai passato l'id in shop_attributes, non ha funzionato, perché sta cercando un'associazione che non esiste ancora.

Se stai cercando di associare a un elemento esistente, si dovrebbe utilizzare il seguente:

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

Questo assegnerà negozio del prodotto corrente al negozio con id 'shop_id'. (Il prodotto dovrebbe avere una colonna 'shop_id'.)

+7

Qualche idea di come funzioni se un prodotto ha più negozi? Mi piace 'params [: product] [: shops_attributes] = {" 0 "=> {" id "=>" 20 "," name "=>" My Shop "}," 1 "=> {...}} '? Grazie! – Cimm

+1

Usando la metodologia 'params [: product] [: shop_id]' puoi fare: 'params [: product] [: shop_ids] = [20,23,27]' –

Problemi correlati