Rails Postgres GROUP 所有列

Rails Postgres GROUP all columns

您必须 GROUP BY 您在 Postgres 中选择的所有列,否则它会生您的气。除了列出所有列之外,还有 simple/clean 方法可以做到这一点吗?

我想到的最好的是以下(意图已评论):

# 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

查找帐户最多的用户的一种方法:

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])

注意:即使多个用户的帐户数量与最多计数相同,这也只会找到一个用户。

时间已经过去了,我不得不说,不幸的是,对于我提出的具体问题,没有更好的解决方案。也许 Rails 5 会有一些东西,我稍后会重新讨论。我在问题中的基本解决方案适用于我的使用,并且可以修改或用于另一个更高级别的方法,而无需太多工作来执行分组。

这也可以在更新 Postgres 适配器时解决。