2013-08-30 6 views
0

레일에 부모 - 자식 연결이있는 모델이 있으며 특정 자식이 부모에 속한 횟수를 계산하고 싶습니다. 예를 들어 Parent1.children = [A, B, C] 및 Parent2.children = [B, D]이면 각 하위 레코드의 수를 얻고 싶습니다. [A => 1, B => 2, C = > 1, D => 1]. 어떻게 하나의 쿼리를 구성해야합니까?레일에있는 자식 레코드의 빈도

+0

먼저 다음, 배열의 모든 아이를 넣어'루비 each_with_object' 방법을 사용,'Hash.new을 가진 (0)' 내부 해시로서 ... –

답변

1

이 당신에게 각 키는 아이의 ID와 각 값 부모의 수입니다 해시를 줄 것이다 :

Children.joins(:parents).group('childrens.id').count 

이렇게하면 각 자녀가 초기화 된 어린이의 배열을 줄 것이다 ATTR와 parents_count 그래서 당신은 다음과 해시 (child => parents_count)를 구축 할 수 있습니다 :

childrens_with_count = Children.joins(:parents).group('childrens.id').select('childrens.*, COUNT(*) AS parents_count') 
childrens_with_count.map { |child| { child => child.parents_count } } 
#=> [#<Child id=1 ...> => 2, #<Child id=2...> => 10 ... ] 
+0

내부 조인이 여기에 적합하지 않습니다. 부모가없는 아이들은 결과물에서 사라집니다. – DNNX

+0

@DNNX 당신 말이 맞아요. 나는 부모가없는 아이가 아이가 아니라고 생각했다. – akhanubis

+0

parent : [[A, B, C], [B, D]]로 그룹화 된 다차원 배열이있는 경우 어떻게 하나부터 진행할 수 있습니까? – graphmeter

1

이 간단한 방법이지만, SQL 쿼리의 관점에서 가장 효율적인하지 않을 수 있습니다 :

child_counts = Parent.each_with_object(Hash.new(0)) { |p, counts| p.children.each { |c| counts[c.id] += 1 } } 

child_counts 결과 해시, 자식 ID 당 수를 (자식 ID가 해시 키입니다) 제공합니다.

+0

감사합니다, 작동하는 것 같습니다 .is t 여기에이 쿼리를 수행하는보다 효율적인 방법이 있습니까? – graphmeter

+0

예, 있습니다. 다른 대답을 참조하십시오. – DNNX

+1

@ 그래프 미터 체크 파블로 B의 대답. 더 "SQL concious" – lurker

관련 문제