繁体   English   中英

按评论数对微博进行排序(Rails)?

[英]Sorting microposts by number of comments (Rails)?

我有2个模型: Microposts (具有has_many :comments )和Commentsbelongs_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM