【问题标题】:List the number of records that have X number of associations in has_many列出在 has_many 中有 X 个关联的记录数
【发布时间】:2017-01-04 19:42:37
【问题描述】:

我的 Person 类将关联 0 个或多个小部件

class Person < ActiveRecord::Base
  has_many :widgets
end

我想列出拥有 X 小部件的人数,即:

Num of widgets | Num of people
0              | 10
1              | 34
2              | 0
...
100            | 20

(也就是说 34 人有 1 个小部件,等等)。

这是我迄今为止的最大努力:

Person.joins(:widgets).group('people.id').select('people.id, count(widget_id) as widget_count').group('widget_count')

但我收到了

 Mysql2::Error: Can't group on 'widget_count'

【问题讨论】:

  • 您可以看到通过在语句后面添加 .to_sql 生成的 sql 并从中学到很多,或者在数据库客户端中尝试该 sql

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


【解决方案1】:

原始 SQL 查询应如下所示(在 PostgreSQL 中测试):

SELECT a.widget_count, COUNT(a.widget_count) FROM 
(SELECT p.id, COUNT(w.id) AS widget_count FROM Person p JOIN Widget w ON w.person_id = p.id GROUP BY p.id) 
AS a 
GROUP BY a.widget_count

【讨论】:

  • 完美,与ActiveRecord::Base.connection.select_all一起使用,得到了我需要的东西!
【解决方案2】:

我无法在语法方面为您提供太多帮助,因为这不是我的强项。但是知道 SQL,您可能想要交换计数。 您计算的实际上是 people.id 的。

希望这对您的思路有所帮助。

【讨论】:

  • 真的吗?我在做 count(widget_id) 所以不确定那是真的吗?无论如何,如果你能在 SQL 中做到这一点,我也许可以翻译成 rails 语法!
  • 其实你是对的。但它会变得混乱。您想计算拥有 COUNT(widgets) 的人数这超出了我的范围。使用 sql,我将使用您的逻辑进行子查询以获取所有人及其人数,然后使用该子查询的结果来获取小部件 coutns 的范围并计算人数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多