2015-01-09 2 views
2

Вы должны GROUP BY все столбцы, которые вы выбираете в Postgres, или он будет злиться на вас. Есть ли простой/чистый способ сделать это, кроме простого перечисления всех столбцов?Rails Postgres GROUP все столбцы

Лучшее, что я придумал следующий (намерение комментируется):

# 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 group? Http://guides.rubyonrails.org/active_record_querying.html#group и 'postgresql group by clause' http://www.postgresqltutorial.com/ PostgreSQL-группа с помощью /? Группирование по всем столбцам в таблице не имеет смысла. –

+0

Я делаю 'INNER JOIN' с таблицей' accounts', чтобы найти пользователей с наибольшим количеством учетных записей, поэтому я использую агрегатную функцию в своем предложении 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

Я ценю альтернативное решение для поиска, но я использовал только пользователь с большинством учетных записей. Мне интересно, что я хочу сделать это в одном SQL-запросе, включающем 'JOIN' и агрегированные функции, есть ли лучший способ, чем то, что мне нужно обойти/работать с Postgres ', чтобы иметь все столбцы в' SELECT' также назван в 'GROUP BY'. – Aaron

Смежные вопросы