想想我在这里有一个简单的问题:
我有一个用户模型和一个帖子模型。用户有很多帖子,帖子属于用户。我想按用户计算帖子总数,并显示帖子最多的前10位用户。这是我到目前为止的代码:
控制器:
@users = User.all
视图:
<% @users.sort.each do |user| %>
<%= user.username %>: <%= user.posts.count(:group => 'user_id') %><br>
<% end %>
这会获取每位用户的总帖子数,但会按用户名排序。我理解为什么会发生这种情况,但不知道我怎么能改变它来按计数排序。任何帮助将不胜感激!
答案 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的答案。他正在使用柜台。这比以我的方式查询数据库更有效。