2012-12-26 14 views
7

Ho due modelli: (Album e prodotto)Creare un'associazione tra due oggetti instancied

1) all'interno modelle

All'interno album.rb:

class Album < ActiveRecord::Base 
    attr_accessible :name 
    has_many :products 
end 

All'interno product.rb:

class Product < ActiveRecord::Base 
    attr_accessible :img, :name, :price, :quantity 
    belongs_to :album 
end 

2) Utilizzo della console "rails", come è possibile le associazioni (quindi posso usare "<% = Product.first.album.name%>")?

ad es.

a = Album.create(:name => "My Album") 
p = Product.create(:name => "Shampoo X") 
# what's next? how can i set the album and the product together? 

risposta

10

Si può fare in questo modo:

a = Album.create(name: "My Album") 

p = Product.create(name: "Shampoo X") 
# OR 
p = Product.create(name: "Shampoo X", album_id: a.id) 
# OR 
p.album = a 
# OR 
p.album_id = a.id 
# OR 
a.products << a 
# finish with a save of the object: 
p.save 

potrebbe essere necessario impostare l'attributo accessibile a album_id sul modello del prodotto (non sicuro di questo).

Controllare anche il commento di @bdares.

+1

Se si aggiunge il '_id' a accessibili, allora si può solo attaccare il valore id come si crea un'istanza di esso:' Product.create (nome: 'Shampoo', album_id: a.id) ' – bdares

+0

@bdares Per aggiungere _id, devo solo usare' attr_accessible: img,: name,: price,: quantity,: _id', giusto? Tuttavia, mi dà questo errore, 'ActiveModel :: MassAssignmentSecurity :: Errore: Impossibile assegnare in massa attributi protetti: album_id' –

+0

@MrYoshiji, per' p.album = a', funziona temporaneamente, ma se riapri il console, il p.album diventa "nil". Per 'p.album_id = a.id', dà questo errore,' NoMethodError: metodo indefinito 'album_id =' '. Per 'a.products << p', restituisce questo errore,' RuntimeError: impossibile modificare Hash congelato'. Devo rigenerare entrambi i modelli? Grazie a tutti! –

2

Aggiungere l'associazione quando si crea il prodotto:

a = Album.create(:name => "My Album") 
p = Product.create(:name => "Shampoo X", :album => a) 
+0

Funziona temporaneamente. Tuttavia, se riaprono la console, p.album diventa "nil" .. –

+0

Stai recuperando lo stesso 'Prodotto' che hai creato la prima volta? Prova il codice precedente, quindi riapri la console e prova 'Product.find_by_name ('Shampoo X'). Album'. –

Problemi correlati