2013-09-22 5 views
2

이 많은 grandparent 문서가 있고 parent이 각각 children 인 것으로 가정 해 봅시다.몽고 이드 - 어린이 자녀 구하기

Mongoid가있는 레일스에서 ​​grandparent 루핑없이 children을 모두 얻는 가장 좋은 방법은 무엇입니까? 내가 루프를 사용한다면

예를 들어,이 (거친 코드)과 같이 보일 것입니다 :

def children 
    children = [] 
    parents.each do |p| 
     p.children.each do |c| 
     children << c 
     end 
    end 
    children.uniq 
    end 

class Grandparent 
    include Mongoid::Document 
    has_many :parents 
end 

class Parent 
    include Mongoid::Document 
    belongs_to :grandparent 
    has_many :children 
end 

class Child 
    include Mongoid::Document 
    belongs_to :parent 
end 
+0

'베스트'목적의 관점에서 정의되어야한다. 성능, 가독성, 모듈성 또는 구체적으로 최적화하고 있습니까? – Mustafa

+0

@Mustafa 성능. – Baub

답변

0

이 같은 방법은 한 번만 호출 속성으로 children를로드 할 것입니다.

def children(reload=false) 
    @children = nil if reload 
    @children ||= Child.where(:parent_id.in => parents.map(&:id)) 
end 

이 참조 SO answer뿐만 아니라

+0

이것은 nil :'children = Child.where (: parent_id.in => parents.map (& : id))'를 반환하지만 내 질문에 반복 예제가 작동합니다. – Baub

+0

@James 연관이 정의 된 방식을 보여주는 모델 파일을 게시하면 도움이됩니다. – tihom

+0

@tihorn이 원래 질문에 추가되었습니다. – Baub