[英]Sorting microposts by number of comments (Rails)?
我有2个模型: Microposts (具有has_many :comments
)和Comments ( belongs_to :micropost
)。
在以下视图中:
views / micropost / index.html.erb:
<h2>Micropost Index</h2>
<% @microposts.each do |micropost| %>
<h2><%= micropost.title %></h2>
<p><%= micropost.content %></p>
<p><%= micropost.comments.count %></p>
<ul>
<li><%= link_to 'Show', micropost %></li>
<li><%= link_to 'Edit', edit_micropost_path(micropost) %></li>
<li><%= link_to 'Destroy', micropost, confirm: 'Are you sure?', method: :delete %></li>
</ul>
<br />
<% end %>
控制器/microposts.rb:
def index
@microposts = Micropost.all
end
我能够获得每个微博的评论数:
<p><%= micropost.comments.count %></p>
如何按评论数对微博进行排序?
有什么建议可以做到这一点?
您可以通过对每个微博的评论进行计数来进行愚蠢的排序,但这不是一个好主意。 因为每次您的索引动作被调用时,rails都会执行N + 1个数据库查询,其中N是微博的数量。
最好的解决方案是使用Rails counter_cache功能。 它是您的微博数据库表中的单独一列,用于存储评论数量。 另外,每次您创建新评论或删除评论时,它都会自动更新。
首先,您需要在数据库中添加一列。 为此,请使用以下内容创建迁移: add_column :microposts, :comments_count, :integer, :default => 0, :null => false
之后,将您的注释模型中的代码更改为类似的内容: belongs_to :micropost, :counter_cache => true
完成所有这些更改后,每次创建新评论时,micropost中的comment_count列都会增加,而每次删除评论时都会减少。 另外,您可以按此列的值对微博进行排序,如下所示:
@microposts = Micropost.order('comments_count ASC').all
您可以在micropost.rb
创建一个方法,并像虚拟属性一样对其进行排序:
def comments_count
comments.count
end
然后使用sort_by
方法对集合进行排序:
<% @microposts.sort_by(&:comments_count).map do |micropost| %>
<%= micropost.title %>
...
<% end %>
另外,如果需要相反的排序方向,则可以使用reverse
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.