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

Shk*_*rik 3 ruby ruby-on-rails rails-activerecord

我有3种型号:Post,Comment,User

Post 有很多 Comments

Comment 属于 User

User 有领域 country_code

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

这个查询:

post.comments.joins(:user).group("users.country_code").order('count_all desc').count
Run Code Online (Sandbox Code Playgroud)

返回这样的结果:

{"DE"=>67,
"US"=>8,
"RS"=>8,
"IN"=>8,
"ES"=>7,
"BR"=>6,
...
"UA"=>0
Run Code Online (Sandbox Code Playgroud)

}

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

Tob*_*obi 6

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

post.comments.group_by{ |c| c.user.country_code }
Run Code Online (Sandbox Code Playgroud)

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

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length }
Run Code Online (Sandbox Code Playgroud)

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

post.comments.group_by{ |c| c.user.country_code }.sort_by{ |k, v| v.length * -1 }
Run Code Online (Sandbox Code Playgroud)

  • 如果评论列表很大(想象带有评论的病毒式Facebook帖子),则此操作的性能可能会很糟糕,因为group_by从数据库中将所有评论加载到内存中。应该避免这种情况,并且只能与固定的已知大小集合一起使用,或者至少与已知最大大小一起使用 (3认同)

K M*_*lam 4

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

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