2012-03-10 49 views
1

我有以下型號:如何將活動記錄的查詢結果分組?

ProfileViews (id, user_id, viewer_id) 

我試圖返回所有USER_VIEWS,這是由viewer_id分組...注viewer_id可以爲零,這是我想回來。我可以說無視等20倍...

爲什麼這不起作用?

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

你會得到什麼錯誤? – 2012-03-10 00:36:50

回答

0

我不認爲你可以在組聲明中有select(*)。你可以嘗試select count(viewer_id)或任何你想要的分組。

更新

你可以看到更多的例子here

1

,因爲你使用PostgreSQL(或一些類似嚴格的數據庫)和你的SELECT列表不匹配您GROUP您的查詢不起作用通過。 SELECT中的所有內容都必須位於聚合函數內(如COUNTAVG,...),或者它必須出現在GROUP BY子句中;一些數據庫(如MySQL和SQLite)會猜測去除歧義,但其他數據庫(如PostgreSQL)則不會。我猜你看到類似的錯誤:在@profile_views它映射

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

這將會給你一個簡單的哈希:

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

你可能尋找更多的東西像這樣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。