如何在Ruby on Rails中查询子记录的数量

时间:2017-09-17 19:04:36

标签: sql ruby-on-rails ruby postgresql activerecord

ItemsCategories之间存在多对多关系。

我试图以下一格式提取属于每个类别的项目数:[category.id, <number of items>]

这是我到目前为止所做的:

Category.joins(:items).select('id, count(id) as quantity')

但它不起作用。任何人都可以帮助我并指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

存在多个问题:

  • id, count(id) as quantity含糊不清,categories.id, count(items.id) as quantity更好
  • joins生成INNER JOIN,但您可能希望使用LEFT OUTER JOIN
  • GROUP BY未指定

对于Ruby on Rails&gt; = 5,您使用:

categories = Category.select('categories.id, count(items.id) as quantity').
                      left_outer_joins(:items).
                      group(:id)

category = categories.first

category.id #=> 12
category.quantity #=> 34

对于Ruby on Rails&lt; 5您将left_outer_joins(:items)替换为:

joins('left outer join items on items.category_id = categories.id')

关于to_sql

的说明

知道可以在to_sql上调用Relation来查看将要运行的SQL可能会有所帮助。如果你针对你的代码打电话,你会看到:

select id,
       count(id) as quantity
from `categories`
inner join `items` ON `items`.`category_id` = `categories`.`id`

这没有多大意义。以下是我们应用更改后得到的结果:

select categories.id,
       count(items.id) as quantity
from `categories`
left outer join `items` ON `items`.`category_id` = `categories`.`id`
group by `categories`.`id`