rails,ruby,如何计数和排序,显示最佳结果

时间:2014-10-24 05:48:45

标签: ruby-on-rails ruby model count

想想我在这里有一个简单的问题:

我有一个用户模型和一个帖子模型。用户有很多帖子,帖子属于用户。我想按用户计算帖子总数,并显示帖子最多的前10位用户。这是我到目前为止的代码:

控制器:

@users = User.all

视图:

<% @users.sort.each do |user| %>
    <%= user.username %>: <%= user.posts.count(:group => 'user_id') %><br>
<% end %>

这会获取每位用户的总帖子数,但会按用户名排序。我理解为什么会发生这种情况,但不知道我怎么能改变它来按计数排序。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

Rails有counter_cache您可以阅读本指南belongs_to Association Reference上的第4.1.2.3点。

首先,您应该在用户模型上添加posts_count列,其中integer数据类型和0默认值。添加posts_count列后,将counter_cache添加到Post.rb

class Post < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
end

如果您在包含用户的帖子中添加记录,则可以在用户模型上自动将1值添加到posts_count属性。因此,如果您想显示帖子最多的前10位用户。你可以试试这个:

@user = User.find(:all, :limit => 10, :order=> 'posts_count desc')

或另一种方法。使用scopes

您可以为用户模型添加范围

Class User < ActiveRecord::Base
 scope :top_ten, select("users.id, other_attribute, count(posts.id) AS posts_count"). joins(:posts).group("users.id").order("posts_count DESC").limit(10)
end

在你的控制器上:

@user = User.top_ten

答案 1 :(得分:1)

首先像这样查询数据库:

@posts_per_user_count = Post.joins(:user).group(:user).order('count_all DESC').limit(10).count

这将导致散列,其中包含带有结果的数组。然后在您的视图中,您可以像这样迭代它:

<% @posts_per_user_count.each do |item| %>
    <%= item[0].username %>: <%= item[1].to_s %><br>
<% end %>

请同时查看anonymousxxx的答案。他正在使用柜台。这比以我的方式查询数据库更有效。