2012-12-26 9 views
7

Ich habe zwei Modelle: (Alben und Produkt)Verband Erstellen zwischen zwei instancied Objekte

1) Innerhalb Modelle

Innen album.rb:

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

Innen product.rb:

2) Mit "Schienen Konsole", wie kann ich se t die Assoziationen (so kann ich "<% = Product.first.album.name%>") verwenden?

z.B.

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? 

Antwort

10

Sie können wie folgt tun:

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 

Sie müssen das Attribut gesetzt werden zugänglich auf dem Produktmodell album_id (nicht sicher, dass).

Überprüfen Sie auch @bdares Kommentar.

+1

Wenn Sie den '_id' zugänglich addieren, dann können Sie nur den ID-Wert halten, wie Sie es instanziiert:' Product.create (name: "Shampoo", album_id: a.id) ' – bdares

+0

@bdares Um _id hinzuzufügen, muss ich nur' attr_accessible: img,: name,: price,: quantity,: _id', oder? Allerdings gibt es mir diesen Fehler, 'ActiveModel :: MassAssignmentSecurity :: Fehler: Kann nicht geschützt Attribute zuweisen: album_id' –

+0

@MrYoshiji, Für' p.album = a', funktioniert es vorübergehend, aber wenn ich wiederöffne die Konsole, das p.album wird zu "nil". Für 'p.album_id = a.id' gibt es diesen Fehler,' NoMethodError: undefinierte Methode 'album_id =' '. Für "a.products << p" gibt es diesen Fehler, "RuntimeError: kann eingefrorenen Hash nicht ändern". Muss ich beide Modelle regenerieren? Danke euch allen! –

2

den Verein hinzufügen, wenn Sie das Produkt zu erstellen:

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

Es funktioniert vorübergehend. Wenn ich jedoch die Konsole wieder öffne, wird das p.album zu "nil". –

+0

Erhalten Sie das gleiche 'Produkt', das Sie das erste Mal erstellt haben? Probieren Sie den obigen Code aus, öffnen Sie die Konsole erneut und versuchen Sie 'Product.find_by_name ('Shampoo X'). Album'. –