我正在尝试按整数顺序对用户进行排名。我得到的整数在我的用户模型中。
def rating_number
Impression.where("impressionable_id = ?", self).count
end
这为网站上的每个用户提供了一个数字(整数形式)。现在,在主页上,我想显示一个有序列表,按顺序将这些用户排在第一位和最小位数第二位的用户。我怎样才能在控制器中实现这一点???
@users = User....???
任何帮助将不胜感激!
更新
在控制器中使用它
@users = User.all.map(&:rating_number)
这是视图
<% @users.each do |user| %>
<li><%= user %></li>
<% end %>
显示用户的计数。不幸的是,变量user
充当整数而非用户,因此附加user.name
不起作用。此外,列表不是基于整数的顺序..
答案 0 :(得分:3)
The advice here is still all kinds of wrong;所有其他答案都会表现得非常糟糕。尝试通过嵌套的select count(*)
执行此操作几乎与使用User.all
和在内存中排序一样糟糕。
如果您希望它在相当大的数据集上工作,那么正确的方法是使用counter caches并停止尝试按相关记录的计数进行排序。
在rating_number
表中添加users
列,并确保其上已定义索引
为您的belongs_to
添加计数器缓存:
class Impression < ActiveRecord::Base
belongs_to :user, counter_cache: :rating_number
end
现在,创建/删除展示次数会修改相关用户的rating_number
。
按rating_number
订购结果,简单明了:
User.order(:rating_number)
答案 1 :(得分:1)
这里的建议只是各种错误。首先正确建立您的关联模型。其次,你不想做User.all然后根据任何东西在内存中排序。您认为它会如何与大量记录一起表现?
您要做的是查询您的用户行,并根据为该用户计算展示次数的子查询对其进行排序。
User.order("(SELECT COUNT(impressions.id) FROM impressions WHERE impressionable_id = users.id) DESC")
虽然这不是非常有效,但它仍然比在内存中使用数据集更有效。下一步是将展示次数缓存在用户自身(la计数器缓存)上,然后将其用于排序。
令我很痛苦的是,做User.all是第一个建议......
答案 2 :(得分:-1)
如果impressions
是users
表中的列,则可以
User.order('impressions desc')
由于它不是用户表中的列,因此您可以执行以下操作:
User.all.each(&:rating_number).sort {|x,y| y <=> x }
抱歉,你想要这个:
User.all.sort { |x, y| y.rating_number <=> x.rating_number }