2010-01-10 11 views
10

Ich bin sicher, dass dies eine sehr einfache Frage, aber ich bin nur ein Neuling so ...Ruby on Rails: Kind Erstellen von Objekten

Ich habe ein Modell, Spiel, das has_many :piles. Pile, wiederum, has_many :cards. Ich bin in der Lage, die Pfähle und Karten bei der Erstellung des Spiels zu bevölkern, so gegenwärtig mein Code sieht ungefähr so ​​aus:

class Game < ActiveRecord::Base 
    has_many :piles 

    def after_create 
    1.upto(4) do |num| 
     Pile.new("game_id" => id, "contents" => "c_type_#{num}") 
    end 
    end 
end 

class Pile < ActiveRecord::Base 
    has_many :cards 
    belongs_to :game 

    def after_create 
    1.upto(10) do |num| 
     Card.new("pile_id" => id, "value" => num) 
    end 
    end 
end 

class Card < ActiveRecord::Base 
    belongs_to :pile 
end 

Das ist aber alles sehr gut ist, aber es fühlt sich falsch "game_id" => id wenn Active werden vorbei kennt, dass game_id der Fremdschlüssel ist und sich auf das Eltern-Spiel beziehen sollte. Aber wenn ich es auslasse, endet der Fremdschlüssel nicht. Gibt es einen besseren Weg, dies zu tun?

(Für einen Bonus, wahrscheinlich einfacher, Frage, nähme Spiel auch has_one :monkey Wie am besten finde ich die Affen aus dem Spiel Modell erstellen.?)

Antwort

14

Statt:

Pile.new("game_id" => id, "contents" => "c_type_#{num}") 

Versuch:

piles.create("contents" => "c_type_#{num}") 

Es wird versucht, den erstellten Stapel sofort zu speichern. Oder, wenn Sie wirklich müssen, dass keine Einsparung stattfindet (was der Fall mit create ist), können Sie tun:

new_pile = piles.build("contents" => "c_type_#{num}") 

Ähnliche für die Stapel-Klasse und ihre Karten.

Was has_one :monkey, können Sie folgendermaßen vorgehen (innerhalb einer Methode von Game):

create_monkey("some_attr" => "some_value") 
3

Ihre Gamepiles Verein Sammlung Objekt build und create Methoden zur Verfügung gestellt von Active Record (die create Methode auch speichert das zugehörige Objekt unter der Annahme, dass es die Validierung besteht).

sollten Sie in der Lage sein, so etwas zu tun:

def after_create 
    1.upto(4) do |num| 
    piles.create(:contents => "c_type_#{num}") 
    end 
end 
0

Zusätzlich zu dem, was die anderen gesagt haben, sollten Sie diese week's railscast sehen betrachten - die mit ererbten Ressourcen in Rails beschäftigt 2.3, speziell in Aussicht.

Teil 2 sollte nächsten Montag (2010-01-18)

erscheinen