2010-01-10 4 views
10

이것은 매우 간단한 질문이지만, 나는 단지 초보자입니다 ...Ruby on Rails : 자식 객체 만들기

has_many :piles 인 게임 모델이 있습니다. 말뚝, has_many :cards. 나는 게임을 만들 때 Piles와 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 

이제이 모든 것이 아주 잘되지만, ActiveRecord 를 사용할 때 "game_id" => id을 넘기는 것은 잘못되었습니다.는 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

액티브 레코드 (또한 create 방법으로 제공 buildcreate 방법이있을 것이다 귀하의 Game 객체의 piles 협회 모음 검증을 통과하면 (자) 관련 지을 수 있었던 오브젝트를 보존합니다.

당신이 뭔가를 할 수 있어야한다 :

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

은 다른 사람이 말한뿐만 아니라,이 week's railscast를 보는 고려해야한다 - 레일 2.3에서 상속 된 자원을 취급하는, 특히보기에.

2 부 월요일 (2010-01-18)