2015-01-09 31 views
2

您必須GROUP BY您在Postgres中選擇的所有列,否則它會生氣。有沒有簡單/乾淨的方式來做到這一點,而不僅僅是列出所有的列?Rails Postgres集團所有專欄

我想出的最好的是以下(意圖被註釋掉):

# The purpose of this query is to return a list of `User`s 
# ordered by the number of `Account`s they have in descending order. 

User.joins(:accounts) 
    .group(User.full_column_names) 
    .order('COUNT("accounts".*) DESC') 

user.rb:找到最賬戶的用戶

def self.full_column_names 
    column_names.collect {|name| "\"#{table_name}\".\"#{name}\"" } 
end 
+0

你確定你清楚'activerecord組方法'的使用http://guides.rubyonrails.org/active_record_querying.html#group和'postgresql group by clause' http://www.postgresqltutorial.com/ PostgreSQL的基團通過/?按表格中的所有列分組是沒有意義的。 –

+0

我正在用'accounts'表做'INNER JOIN'以找到賬號最多的用戶,所以我在'ORDER'子句中使用了一個聚合函數。 默認情況下,Rails會從AR模型中選擇所有的列,在這種情況下,'SELECT「用戶」。* ...'是我想要的,因爲我正在尋找完整的'User'對象。這是否更有意義?我可能錯過了一個更簡單的解決方案,這是迄今爲止我所提出的最好的解決方案。 – Aaron

回答

0

足夠的時間已經過去了,我不得不說,不幸的是,我沒有提出更好的解決方案。也許Rails 5會有一些東西,我稍後會重新討論。我在問題中的基本解決方案適用於我的用法,可以修改或在另一個更高級別的方法中使用,而不需要太多工作來執行分組。

這也可以在Postgres適配器的更新中解決。

0

方式一:

user_id, number_of_accounts = Account.group(:user_id).count.max_by{ |key, value| value} 
user_with_most_accounts = User.find(user_id) 

查詢結果爲:

user_with_most_accounts = User.find(Account.group(:user_id).count.max_by{ |key, value| value}[0]) 

注意:即使多個用戶具有與最多計數相同的帳戶數量,也只能找到一個用戶。

+0

我很欣賞替代搜索解決方案,但我僅以大多數帳戶的用戶爲例。我感興趣的是,我想在一個涉及'JOIN'和集合函數的SQL查詢中做到這一點,有沒有比我必須解決的更好的方式/與Postgres的工作'需要所有列在' SELECT'也在'GROUP BY'中命名。 – Aaron