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 适配器时解决。
您必须 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 适配器时解决。