我如何查询Ruby中的儿童记录



我在 ItemsCategories之间有很多与众不同的关系。

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

这是我到目前为止所拥有的:

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

但行不通。谁能帮我指向正确的方向?

有多个问题:

  • id, count(id) as quantity是模棱两可的,categories.id, count(items.id) as quantity更好
  • joins产生INNER JOIN,但您可能要使用LEFT OUTER JOIN
  • 未指定GROUP BY

对于Ruby on Rails> = 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在Rails&lt上;5您用:

替换left_outer_joins(:items)
joins('left outer join items on items.category_id = categories.id')

关于to_sql

的注释

知道您可以在Relation上调用to_sql以查看将要运行的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`

最新更新