2012-10-04 7 views
2

내가 좋아하는 객체 모델이 있습니다자식이 has_many 인 ActiveRecord 객체가 자식이 속한 경우를 알고 있습니까?

class parent < ActiveRecord::Base 
    has_many: children 
end 

class child < ActiveRecord::Base 
    belongs_to: parent 
end 

나는 같은 것을 할 경우 내 질문입니다 :

a_parent = Parent.create 
child = Child.create(parent: a_parent) 

을 부모가 새로운 자식 객체 인식 할 수있는 깨끗한 방법이 너무 나는 부모님이 출생 발표를 보내는 것처럼 뭔가를 할 수 있습니까? 나는 아이가 그것을하지 못하게하고 싶다. (그들은 철자조차 할 수없고, 우표를 줄 수는 없다.) :)

관찰자를 사용하거나 자식에서 after_create를 사용하여 부모 (parent.look_at_me 호출)에서 공용 메서드를 호출하는 방법을 생각해보십시오. 이상적으로 나는 부모님이 정의한 것을 원합니다. 다른 아이디어?

+0

자신에게 물어야하는 질문은 '부모가 자녀에 대해 알아야합니까?'라는 질문입니다. 나는 새로운 아이가있을 때 부모의 어떤 속성이 바뀌지 않는 한, 왜 그런지 보지 못합니다. 출생 공고가 이메일 메시지라면, 나는 after_create 또는 observer를 사용하여 Mailer 클래스에 메시지를 보낼 것입니다. –

답변

1

당신이이 같은 경우에 작동 할 Association callbacks

class Parent 
    has_many :children, :after_add => :send_birth_announcement 

    def send_birth_announcement(child) 
    # ... 
    end 
end 

을 사용할 수 있습니다 새는 추상화이기 때문에 그런 전화를 놓치지 않을 것입니다. 뒤로. 부모를 인스턴스화하지 않고 항상 자식을 만들 수 있으므로 자식의 after_create은 그다지 좋지 않습니다.

+0

우수한 팁. 고마워요 - 그걸 찾고 있었어요! – Jason

-2

적절한 마이그레이션을 수행해야합니다. here을 참조하십시오. 위 코드를 수행하면 자동으로 a_parentchild에 연결됩니다.

0

기본 대답은 예, 부모는 자녀에 대해 알고 있습니다. 이것은 자식 테이블에 parent_id 필드를 가짐으로써 이루어진다. 부모가 자녀를 찾고자 할 때마다 올바른 부모 ID를 가진 모든 어린이를 위해 해당 테이블을 요청해야합니다.

이것은 관계형 데이터베이스의 기본 개념으로, 모델 연결을 사용할 때 어떤 일이 벌어지고 있는지 이해하기 위해 더 자세히 읽을 가치가 있습니다.

편집 : 그러나

a_parent.children << a_child 
a_parent.children.create(child_attributes) 

, ORM을 : 귀하의 예를 들어 약간의 코드 수정이

a_parent = Parent.create 
child = Child.create(:parent => a_parent) 
관련 문제