2010-01-10 10 views
10

Jestem pewien, że jest to bardzo proste pytanie, ale jestem tylko początkującym więc ...Ruby on Rails: Tworzenie obiektów podrzędnych

Mam modelu, gra, która has_many :piles. Pile z kolei has_many :cards. Jestem w stanie wypełnić stosy i karty przy tworzeniu gry, więc mój kod w chwili obecnej wygląda coś jak:

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 

Teraz to wszystko jest bardzo dobrze, ale czuje się źle, gdy przechodził "game_id" => id ActiveRecord zna, że id gry jest kluczem obcym i powinien odnosić się do gry nadrzędnej. Ale jeśli go zostawię, klucz obcy zostanie unieważniony. Czy jest lepszy sposób to zrobić?

(do premii, chyba prostsze pytanie, załóżmy gra również has_one :monkey Jak najlepiej utworzyć małpa od wewnątrz modelu gry.?)

Odpowiedz

14

Zamiast:

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

try:

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

Próbuje szybko zapisać utworzony stos. Lub, jeśli naprawdę trzeba, że ​​nie zachodzi oszczędność (co ma miejsce w przypadku create), można zrobić:

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

Podobny do klasy Pile i jej kart.

chodzi o has_one :monkey, można wykonać następujące czynności (od wewnątrz metody gry):

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

Twojego Game obiektu piles stowarzyszenie kolekcja będzie miała build i create metod przewidzianych przez Active Record (metoda create także zapisuje powiązany obiekt przy założeniu, że pomyślnie przechodzi walidację).

Powinieneś być w stanie zrobić coś takiego:

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

W dodatku do tego, co mówili inni, należy rozważyć przegląda ten week's railscast - która zajmuje się odziedziczonych zasobów w Rails 2.3, a konkretnie w widokach.

Część 2 powinna pojawić się w następny poniedziałek (2010-01-18)