我在我的应用程序中使用了一个简单的关注者系统,我可以通过运行User.followers.count
来获取任何用户关注者的数量。但是,当我尝试按照每个用户@orderedUsers = User.all.order("followers.count DESC")
的跟随者数量对所有用户进行排序时,它会返回错误“ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:no such column:followers.count”。显然,这是因为没有这样的专栏。有没有办法解决这个问题,做我想做的事情?
感谢。
答案 0 :(得分:3)
此代码应该有效(假设数据库表名是用户和关注者):
User.joins(:followers).order("count(followers.user_id) desc")
答案 1 :(得分:1)
如下:
@ordered_users = User.all.sort{|a,b| a.followers.count <=> b.followers.count}
对于相反的顺序,你可以这样做:
@ordered_users = User.all.sort{|a,b| b.followers.count <=> a.followers.count}
或者,.reverse
,正如您在评论中所说的那样。
编辑:@Alex Quach在另一篇文章中留下了不错的选择。我已将其修改为不包含列表中当前用户的位置,这可能会有所帮助:
User.all.where('id != ?', current_user.id).sort_by { |u| -u.followers.count }
答案 2 :(得分:0)
我强烈建议在用户模型上使用计数器缓存,以保留关注者的数量。
这会对添加或删除关注者产生非常小的性能影响,并在执行排序时大大提高性能:
User.order(followers_count: :desc)
如果您想通过关注者计数排名前n位的用户,或者找不到关注者的用户,那么这一点尤为明显。