2013-08-30 161 views
0

我有一個在軌道中的父子關聯模型,並且想要計算特定子項屬於父項的次數。如果例如:Parent1.children = [A,B,C]和Parent2.children = [B,D],我想要得到每個子記錄的計數[A => 1,B => 2,C = > 1,D => 1]。應該如何構建查詢?軌道中的子記錄的頻率

+0

首先把所有的孩子在一個數組,然後使用'在Ruby中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

如果我有一個按父級分組的多維數組:[[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

謝謝,似乎工作..是噸這裏是一個更有效的方法來做這個查詢? – graphmeter

+0

是的,有。看另一個答案。 – DNNX

+1

@graphmeter檢查Pablo B的答案。它更「SQL意識」 – lurker