繁体   English   中英

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

[英]How to group a query result with active record?

我有以下模型:

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)   

您的查询无效,因为您使用的是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为您提供一个简单的Hash,该哈希将viewer_id (包括nil )映射到视图数。

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。

我认为您不能在group语句中使用select(*) 您可以尝试select count(viewer_id)或要进行的任何分组。

更新

您可以在这里看到更多示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM