2012-03-19 3 views
0

글쎄, 하나의 모델 (ModelA)을 두 번째 모델 (ModelB)에서 세 번째 모델 (ModelC)로 연결하는 방법을 알고있다. 그러나 세 번째 모델 (ModelC)이 네 번째 모델 (ModelE)의 여물 (ModelD)에 연결되면 어떻게 될까요?Rais 긴 체인 모델 연결

#ModelA 
has_many :model_bs 
has_many :model_cs, :trough => :model_bs 

#ModelC 
has_many :model_ds 
has_many :model_es, :trough => model_ds 

질문은 다음과 같습니다. 특정 ModelA 레코드 트로프 체인과 연관된 ModelE 레코드 컬렉션을 얻으려면 어떻게해야합니까?

+0

직접 경로 a.model_cs.model_es를 사용해 보았지만 실제로는 작동하지 않습니다. – Almaron

+0

나는 직접 쿼리를 작성하려고 노력했지만 매우 좋지는 않으며 너무 복잡해 보입니다. – Almaron

답변

2

ModelA의 인스턴스에서 model_cs을 호출하면 model_cs의 배열이 반환됩니다. 그런 다음 model_es에 모두 액세스하려면 model_cs 배열을 반복하고 그 결과를 배열이나 해시에 추가해야합니다.

array1 = @model_a.model_cs.all 
array2 = [] 
array1.each do |x| 
    array2 << x.model_es 
end 

array2 이제 포함 된 모든 그의 궁극적 인 부모 원래 model_amodel_es.

+0

고마워, 나는 비슷한 것을 생각하고 있었지만, 더 쉬운 것이 있다고 생각했다. – Almaron

+0

'map'을 사용하여 코드를 단축 할 수 있습니다. 다음 (안 함)은'array = @ model_a.model_cs.map {| x | x.model_es}'. 이것은 같은 일을하지만 briefer 형태입니다. –

+2

구문 해석 설탕'@ model_a.model_cs.map (& : model_es)'을 사용하여 더 단축 할 수 있습니다. 요구 사항에 따라 결과에'flatten'과'uniq'를 호출 할 수도 있습니다. – Brandan