我有一個在軌道中的父子關聯模型,並且想要計算特定子項屬於父項的次數。如果例如:Parent1.children = [A,B,C]和Parent2.children = [B,D],我想要得到每個子記錄的計數[A => 1,B => 2,C = > 1,D => 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 ... ]
內部連接在這裏不太合適。輸出中缺少沒有父母的孩子。 – DNNX
@DNNX你說得對。我認爲一個沒有父母的孩子不是孩子。 – akhanubis
如果我有一個按父級分組的多維數組:[[A,B,C],[B,D]],那麼將如何從那裏繼續? – graphmeter
這是一個簡單的方法,但可能不會從SQL查詢角度來看,最有效的:
child_counts = Parent.each_with_object(Hash.new(0)) { |p, counts| p.children.each { |c| counts[c.id] += 1 } }
所生成的散列,child_counts
,給每個孩子ID計數(子ID是哈希鍵)。
謝謝,似乎工作..是噸這裏是一個更有效的方法來做這個查詢? – graphmeter
是的,有。看另一個答案。 – DNNX
@graphmeter檢查Pablo B的答案。它更「SQL意識」 – lurker
- 1. 軌道記錄推
- 2. 在軌道創建子記錄3
- 3. 軌道 - /子目錄
- 4. 軌道中的活動記錄
- 5. 軌道更新記錄
- 6. 測試記錄軌道3.1
- 7. 保存在軌道上的記錄
- 8. 軌道遍歷鏈接的記錄
- 9. 頻道頻率數
- 10. 在軌道中分組記錄
- 11. 在軌道中合併記錄3
- 12. 在軌道中刪除多條記錄
- 13. 軌道4 - 保持子記錄與belongs_to的衆多車型
- 14. 如何從軌道中的活動記錄結果數組中刪除記錄?
- 15. 分組時不顯示軌道記錄
- 16. 從兩個ID創建軌道記錄
- 17. 取從活動記錄軌道
- 18. 軌道預取記錄在隊列
- 19. 軌道活動記錄關係排序
- 20. 軌道記錄錯誤在啓動時
- 21. 軌道4 attr_accessor和新記錄
- 22. 調試軌道活動記錄查詢
- 23. 使用活動記錄軌道
- 24. 軌道人造活動記錄
- 25. 如何獲得兩列從uniq的表中的記錄 - 軌道
- 26. 按頻率排序SQL查詢記錄
- 27. 按Arel頻率訂購記錄
- 28. 如何限制記錄頻率?
- 29. 軌道3訂單記錄由大孩子計數
- 30. 將兩個對象鏈接到軌道活動記錄中的單個記錄
首先把所有的孩子在一個數組,然後使用'在Ruby中each_with_object'方法中,具有'Hash.new(0)'作爲內部哈希... –