获取按关联字段分组的所有记录,并按组中的计数排序

时间:2015-08-27 16:07:18

标签: ruby-on-rails ruby rails-activerecord

我有3个模型:PostCommentUser

Post有很多Comments

Comment属于User

User有字段country_code

我希望获得按国家/地区代码分组的所有帖子评论,并按照每个国家/地区的评论数量排序。

此查询:

post.comments.joins(:user).group("users.country_code").order('count_all desc').count

返回这样的结果:

{"DE"=>67,
"US"=>8,
"RS"=>8,
"IN"=>8,
"ES"=>7,
"BR"=>6,
...
"UA"=>0

}

我需要的是类似的结果,其中国家/地区代码是键,但值是注释数组。我不知道如何实现这一目标。

3 个答案:

答案 0 :(得分:6)

您可以使用Ruby枚举模块附带的group_by

post.comments.group_by{ |c| c.user.country_code }

如果您还希望按每组中的评论数量排序,也可以:

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length }

我想在相反的方向上进行排序,你可以在排序块中将长度乘以-1

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length * -1 }

答案 1 :(得分:3)

尝试这样的事情:(未经测试):

post.comments.joins(:users).select("users.country_code, count(1) as count_all").group("users.country_code").order('count_all desc')

答案 2 :(得分:-2)

我认为如果你通过分组使用group将在sql中返回一个聚合结果,该结果不会包含所有注释。你应该包括用户,然后在ruby中分组。像这样:

post.comments.includes(:users).inject({}){|r, x| r[x.user.country_code].nil? ? r[x.user.country_code] = [x] : r[x.user.country_code] << x;r}