2010-01-10 15 views
10

Bunun çok basit bir soru olduğuna eminim, ama ben sadece yeni biriyim ...Ruby on Rails: Çocuk nesneleri oluşturma

Bir modelim var, Game, has_many :piles. Kazık, sırayla, has_many :cards. Oyunun yaratılmasında Yığınları ve Kartları doldurabiliyorum, bu yüzden şu anki kodum şunun gibi bir şeye benziyor:

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 

Şimdi bu her şey çok iyi, ama ActiveRecord olduğunda "game_id" => id'den geçmek yanlış geliyor'in o game_id'in yabancı anahtar olduğunu ve ebeveyn oyununa başvurması gerektiğini bilir. Ama eğer onu bırakırsam, yabancı anahtar bozulur. Bunu yapmanın daha iyi bir yolu var mı?

(Bir bonus için, muhtemelen daha basit, soru; Game de has_one :monkey varsayalım. Oyunu modelinden maymunu en iyi nasıl yaratabilirim?)

cevap

14

yerine:

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

deneyin:

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

Oluşturulan yığını hemen kurtarmaya çalışır. Size gerçekten hiçbir tasarrufu (create olduğu) gerçekleştiğini gerekirse Veya, bunu yapabilirsiniz: Kazık sınıfı ve onun kartları için

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

Benzer. has_one :monkey gelince

, yapabileceğiniz (Oyunun bir yöntem içinde) Aşağıdaki:

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

Aktif Record (ayrıca create yöntemle sağlanan build ve create yöntemleri var erecek Game nesnenin piles dernek toplama Doğrulama geçtiğini varsayarak ilişkili nesneyi kaydeder).

Böyle bir şey yapmak mümkün olmalıdır:

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

Başkalarının söylediklerini ek olarak, bu week's railscast inceleyen düşünmelisiniz - Raylar 2.3'te kalıtsal kaynaklar ele alan, özellikle görünümlerinde.

Part 2, önümüzdeki pazartesi günlerde görünmeli (2010-01-18)