ActiveRecord查询方法:组

时间:2015-05-28 18:20:19

标签: ruby-on-rails ruby activerecord

我已经在查询方法“group”上阅读了Ruby文档,但我很难理解如何使用它。

假设我有一个名为users的表,并且有字段名称,电子邮件,性别。

我可以输入User.group(:name).count,它返回一个键值对{name:count}的哈希值。

为什么User.group(:name)不起作用?

有没有办法对相似的名称进行分组,并访问这些记录? 恩。 User.group(:name).first或User.group(:name).each

在我看来,我正在考虑错误地使用“群组”。

1 个答案:

答案 0 :(得分:1)

  

为什么User.group(:name)不起作用?

在SQL中使用GROUP BY时,它也需要一个SELECT子句。但是在你的情况下它不存在,并且会引发错误。

在您的第一个案例中,查询为SELECT COUNT(*) from users GROUP BY name,这就是它起作用的原因。

根据您的上一句话,您需要:

User.group(:name).select(:name).each do |record|
  # work with record
end

我不知道您使用的是什么数据库客户端,但这是来自Postgresql GROUP BY文档的想法。

  

GROUP BY会将所有选定的行压缩为一行,这些行对于分组表达式共享相同的值。 expression可以是输入列名,也可以是输出列(SELECT列表项)的名称或序号,或者是由输入列值组成的任意表达式。如果不明确,GROUP BY名称将被解释为输入列名称而不是输出列名称。

     

聚合函数(如果有的话)在组成每个组的所有行中计算,为每个组生成一个单独的值(而没有GROUP BY,聚合生成一个单独的值计算在所有组中选定的行)。当GROUP BY存在时,SELECT列表表达式无法引用除聚合函数之外的未分组列,因为未分组<返回 ungrouped < / em>专栏。