Rails按方法对用户进行排序

时间:2014-02-07 00:22:01

标签: ruby-on-rails ruby-on-rails-4

我正在尝试按整数顺序对用户进行排名。我得到的整数在我的用户模型中。

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不起作用。此外,列表不是基于整数的顺序..

3 个答案:

答案 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)

如果impressionsusers表中的列,则可以

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 }