为什么这个组子句不起作用

时间:2013-08-26 14:42:35

标签: ruby-on-rails activerecord

我有一个包含5行的Payment模型。其中4个具有相同的user_id,另一个具有不同的user_id。我尝试通过user_id对这些结果进行分组。它应该返回两个结果,但是在尝试这个时我总是得到五个结果。知道为什么吗?

(我正在使用Postgres)

Payment.find(:all, group: "user_id,id").count
=> 5 

也试过

Payment.find(:all, group: "id,user_id").count
=> 5 

更新:如果我没有添加“user_id”我收到此错误

ActiveRecord::StatementInvalid: PG::Error: ERROR:  column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "payments".* FROM "payments"  GROUP BY user_id
               ^
: SELECT "payments".* FROM "payments"  GROUP BY user_id

更新2:此查询

Payment.joins(:user).select('payments.id,users.username,payments.user_id,payments.token,payments.period_start_at,payments.amount_cents,payments.currency').group("user_id")

返回PG::Error: ERROR: column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT payments.id,users.username,payments.user_id,payments.... ^

如果我将“payments.id”添加到group子句中,它将不会按user_id对它们进行分组。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

嗯,您无法按id对其进行分组,因为id可能是您桌上的serial唯一键。仅按user_id分组。

已更新

显然你正在使用rails v 2.3.*或其他东西。此外,这是数据库知识。 SQL中的查询将如下所示:

SELECT COUNT(user_id), user_id FROM payments GROUP BY user_id
#=> user_id | count
    10        2
    3         1
    4         10

这将为您提供某些用户拥有的付款数量。要将此转换为ActiveRecord查询,您必须执行以下操作:

Payment.count(:group => :user_id)

答案 1 :(得分:0)

您按id进行分组。 id是唯一的。你必须有5组,每组一条记录。你不能(有意义地)按id分组。

您还使用了过时的find(:all, ...)语法。请改用Payment.group("user_id")