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