[英]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中的所有内容都必须在聚合函数中(例如COUNT
, AVG
,...)或必须出现在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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.