2012-02-13 4 views
1

한 모델에서 다른 모델로 관계를 설정하는 방법을 알고 싶지만 여러 연관을 통해 알고 싶습니다.다중 연관을 사용하여 한 모델에서 다른 모델로 관계 설정

이 예에서는 Member 모델하는 Sportsorginazation 모델하는 Basketballclub 모델 (다른 모델로 정의이 클럽이 필요하다 예를 위해서)를 Footballclub 모델이있다.

이 Sportsorganization에는 여러 개의 Basketballclub과 여러 Footballclub이 있다고 가정 해 보겠습니다. Basketballclubs와 Footballclub에는 모두 많은 회원이 있습니다.

나는 스포츠 회원으로부터 모든 회원을 어떻게 얻을 수 있습니까?

내가 좋아하는 뭔가를 가지고 상상할 수 :

class Sportsorganization 
    has_many :basketballclubs 
    has_many :footballclubs 
    has_many :members, :through => :basketballclubs 
end 

하지만이 basketballclubs과 footballclubs 모두에서 모든 회원을 얻을 것 어떻게? 회원들에게 별칭을 만들 수 있고 Sportsorganization에 basketballclub 회원과 footballclub 회원이 있다는 것을 알고 있지만, 모든 회원이 basketballclub과 footballclub을 사용하는 것도 가능합니까?

답변

1

@tadman은 내가 아는 한 정확하지만이 작업을 수행하는 순진 방법이 있습니다 :

has_many :basketballclub_members, :through => :basketballclubs, :class_name => 'Member' 
has_many :footballclub_members, :through => :footballclubs, :class_name => 'Member' 

def all_members 
    basketballclub_members + footballclub_members 
end 

매우 순진하지만-you'd 아마 memoize 할 것입니다 (캐시) 그 결과는 +입니다.

: 나는이 그래서 일부 조정이 필요할 수 있습니다 테스트하지 않았습니다

has_many :basketballclub_members, :through => :basketballclubs, :class_name => 'Member' 
has_many :footballclub_members, :through => :footballclubs, :class_name => 'Member' 

composed_of :members, [ 'basketballclub_members', 'footballclub_members' ], 
    :class_name => 'Array', 
    :constructor => proc {|bb_members, fb_members| bb_members + fb_members } 

을 예컨대을 composed_of를 사용하는 약간 덜 순진가 될 것이다, 그러나 그것은 기본적인 생각이다.

경고문 -이 두 가지 방법 중 하나를 사용하면 손쉬운 ActiveRecord 컬렉션 방법을 모두 잃을 수 있습니다 (일반 개체 배열을 얻을 수 있습니다).

+0

감사합니다. compose_of에 Array가 아닌 ActiveRecord를 사용하는 방법이 없다고 생각합니다. – Arjan

0

이와 같은 관계는 ActiveRecord의 표준 패턴이 수용 할 수있는 것보다 복잡해질 수 있으므로 창의적인 솔루션을 제시하거나 상자에서 다시 시도 할 수 있습니다.

모든 다른 종류의 클럽을 캡슐화하기 위해 STI 모델을 만드는 것이 효과적 일 수 있습니다. 두 번째 방법은 속성을 역 정규화하여 각 구성원을 관련 Sportsorganization에 직접 연결하는 것입니다.