我有3个模型:Post
,Comment
,User
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
}
我需要的是类似的结果,其中国家/地区代码是键,但值是注释数组。我不知道如何实现这一目标。
答案 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}