Rails Postgres GROUP所有专栏

时间:2015-01-09 15:59:34

标签: ruby-on-rails postgresql group-by

你必须GROUP BY你在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

2 个答案:

答案 0 :(得分: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])

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

答案 1 :(得分:0)

已经过了足够的时间我不得不说,遗憾的是,对于我提出的具体问题,没有更好的解决方案。也许Rails 5会有一些东西,我稍后会再次访问它。我在问题中的基本解决方案适用于我的使用,可以修改或在另一个更高级别的方法中使用,而无需执行分组。

这也可以在对Postgres适配器的更新中解决。