2010-01-10 65 views
10

我敢肯定,這是一個很簡單的問題,但我只是個新手,所以......Ruby on Rails的:創建子對象

我有一個模型,遊戲,其中has_many :piles。樁,反過來,has_many :cards。我能夠填充樁和卡在創建的遊戲,所以我目前的代碼看起來是這樣的:

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 

現在,這都很好,但感覺不對路過"game_id" => id時的ActiveRecord 知道 game_id是外鍵,應參考父遊戲。但是如果我放棄它,那麼外鍵最終會失效。有一個更好的方法嗎?

(對於獎金,可能更簡單,問題;假設遊戲也has_one :monkey如何最好的我從遊戲模式中創建的猴子?)

回答

14

相反的:

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

嘗試:

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

它試圖立即保存創建的樁。或者,如果你真的需要沒有儲蓄髮生(這是與create的情況下),你可以這樣做:

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

類似的樁類及其卡。

至於has_one :monkey,你可以做以下(從博弈論的方法中):

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

Game對象的piles協會收藏將通過活動記錄(該create方法還提供了buildcreate方法假設它通過驗證,保存關聯的對象)。

你應該能夠做這樣的事情:

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

除了什麼其他人說,你應該考慮查看此week's railscast - 這在Rails的2.3遺傳資源的交易,特別是在意見。

第2部分應該會出現在下週一(2010-01-18)