rails中子记录的频率

时间:2013-08-30 20:03:24

标签: ruby-on-rails ruby

我在rails中有一个带有父子关联的模型,并且想要计算特定子项属于父项的次数。如果例如:Parent1.children = [A,B,C]和Parent2.children = [B,D],我想得到每个子记录的计数[A => 1,B => 2,C => 1,D => 1]。如何构建查询?

2 个答案:

答案 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 ... ]