2015-08-27 30 views
2

分組和排序的通過計數的所有記錄我有3種型號:PostCommentUser獲得由聯想場組

Post有許多Comments

Comment屬於User

User有場country_code

我想獲取所有職位通信按國家代碼分組並按每個國家的評論數量排序。

這個查詢:

post.comments.joins(:user).group("users.country_code").order('count_all desc').count 

返回這類結果:

{"DE"=>67, 
"US"=>8, 
"RS"=>8, 
"IN"=>8, 
"ES"=>7, 
"BR"=>6, 
... 
"UA"=>0 

}

我需要的是一個類似的結果,其中國家代碼是關鍵,但值的評論陣列。我不知道如何做到這一點。

回答

0

嘗試這樣:(未經測試):

post.comments.joins(:users).select("users.country_code, count(1) as count_all").group("users.country_code").order('count_all desc') 
3

你可以使用自帶的紅寶石枚舉模塊

post.comments.group_by{ |c| c.user.country_code } 

的GROUP_BY如果你也希望它下令量每組中的評論也是可能的:

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length } 

我想在反對中得到排序您可以在排序模塊中將長度乘以-1

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length * -1 } 
-2

我想如果你使用group by grouping會發生在sql返回一個不包含所有註釋的聚合結果。你應該包括用戶,然後在ruby中進行分組。事情是這樣的:

post.comments.includes(:users).inject({}){|r, x| r[x.user.country_code].nil? ? r[x.user.country_code] = [x] : r[x.user.country_code] << x;r} 
+2

如果使用ActiveRecord的方法'group',你說,這將彙總結果,但如果你使用完全不同的Ruby方法'group_by'如圖我的回答則它不彙總,並給出所需的結果。不要使用複雜的'inject'模塊來做與'group_by'完全相同的事情。 –