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

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

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

控制器:

@users = User.all 

视图:

  :  'user_id') %>

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

首先查询数据库,如下所示:

 @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 %>
<% end %>

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

Rails有counter_cache你可以在本指南中读取点4.1.2.3 belongs_to Association Reference 。

首先,你应该在User模型上有一个posts_count列,其中包含integer数据类型和0默认值。 添加posts_count列后,将counter_cache添加到Post.rb

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

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

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

或者另一种方法。 使用范围

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

 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