Items
和Categories
之间存在多对多关系。
我试图以下一格式提取属于每个类别的项目数:[category.id, <number of items>]
这是我到目前为止所做的:
Category.joins(:items).select('id, count(id) as quantity')
但它不起作用。任何人都可以帮助我并指出正确的方向吗?
答案 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`