我有以下型号:
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)
答案 0 :(得分:1)
您的查询不起作用,因为您使用的是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
中为您提供一个简单的哈希,它将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)