我在rails中有一个带有父子关联的模型,并且想要计算特定子项属于父项的次数。如果例如:Parent1.children = [A,B,C]和Parent2.children = [B,D],我想得到每个子记录的计数[A => 1,B => 2,C => 1,D => 1]。如何构建查询?
答案 0 :(得分: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是哈希键)。
答案 1 :(得分: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 ... ]