我想我在这里有一个简单的问题:
我有一个用户模型和一个帖子模型。用户有很多帖子,帖子属于用户。我想按用户统计帖子总数,并显示帖子最多的前 10 个用户。这是我到目前为止的代码:
Controller :
@users = User.all
查看:
<% @users.sort.each do |user| %>
<%= user.username %>: <%= user.posts.count(:group => 'user_id') %><br>
<% end %>
这让我得到每个用户的帖子总数,但按用户名排序。我明白为什么会这样,但不确定如何更改它以改为按计数排序。任何帮助将不胜感激!
最佳答案
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
如果您添加一条包含用户的帖子记录,它会自动将1
值添加到User 模型的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
在你的 Controller 上:
@user = User.top_ten
关于ruby-on-rails - rails, ruby, 如何计数和排序,显示最佳结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542223/