如何将查询结果与活动记录分组?

时间:2012-03-10 00:33:20

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

我有以下型号:

ProfileViews (id, user_id, viewer_id)

我正在尝试返回所有user_views,它们按viewer_id分组...注意viewer_id可以为nil,这是我想要返回的内容。我可以说nil等20次观看......

为什么这不起作用?

@profile_views = ProfileView.select('*').where(:user_id => current_user.id).group(:viewer_id)   

2 个答案:

答案 0 :(得分:1)

您的查询不起作用,因为您使用的是PostgreSQL(或类似的严格数据库),并且您的SELECT列表与您的GROUP BY不匹配。 SELECT中的所有内容必须位于聚合函数内(例如COUNTAVG,...),或者它必须出现在GROUP BY子句中;一些数据库,如MySQL和SQLite,将猜测消除歧义,但其他数据库,如PostgreSQL,将不会。我猜你看到的错误类似于:

ERROR:  column "X" must appear in the GROUP BY clause or be used in an aggregate function

你可能正在寻找更像这样的东西:

@profile_views = ProfileView.where(:user_id => current_user.id)
                            .count(:group => :viewer_id)

这会在@profile_views中为您提供一个简单的哈希,它将viewer_id(包括nil s)映射到视图数量。

AR的那一点等同于这个SQL:

select viewer_id, count(*)
from profile_views
where user_id = #{current_user.id}
group by viewer_id

您会注意到SELECT中的所有内容都在GROUP BY或聚合中。

您无法在计数的同时获取ProfileView对象。当您添加GROUP BY时,您正在折叠具有相同viewer_id的行,并且一旦行丢失了它们的标识,数据库就无法选择应该使用哪一行来实例化ProfileView。 / p>

答案 1 :(得分:0)

我认为你不能在小组声明中拥有select(*)。您可以尝试select count(viewer_id)或您要进行的任何分组。

<强>更新

您可以看到更多示例here

相关问题