0

我试图在 article#index 中显示每篇文章有多少评论。

所以我有以下型号

resources Article do
 resources Comments do
 end
end

我知道在每篇文章中我都可以执行以下操作,这将起作用:

@count = @article.comments.find(:all).count

并且只显示在视图计数中。但是,当我在索引文件中并且不确定如何显示此事件 atm 存在多少评论时,问题就来了。

提前致谢

4

3 回答 3

2

文章控制器.rb

def index
  @articles = Article.all
end

文章/index.html.erb

<% @articles.each do |article| %>
  comments in article <%= article.comments.count %>
<% end %>

嵌套路由(文章中的评论)在创建/销毁评论路由方面更重要。还要确保accepts_nested_attributes_for :comments在您的文章模型中添加。这将允许您执行以下操作:

例如,在articles_controller.rb

def show
  @article = Article.find(params[:id])

  # creates a new comment object with atricle_id already initialized
  @comment = @article.comments.build
end

编辑

如果您确实开始关心性能,我同意 Kitto 的评论。

添加此迁移:

class AddCommentsCountToArtices < ActiveRecord::Migration
  def change
    add_column :articles, :comments_count, :integer, null: false, default: 0
  end
end

并将您的 Comment 模型中的关系声明更改为:

belongs_to :article, counter_cache: true

然后你可以像这样调用article.comments_count来获取 count 而不是atricle.comments.count. 如果计数为 0,那就太好了,因为它甚至不进行查询(Rails 3 Way 的第 195 页)。

如果您对 counter_cache 的工作原理感到好奇:它会向所属类(在本例中为 Comment 类)添加一个回调,该回调会在每次创建或销毁评论时更新父文章的 comments_counter 属性。

此外,正如Obie Fernandez所展示的,counter_cache 功能可以轻松添加到现有数据库中。

于 2012-08-29T17:14:28.337 回答
2

在articles#index 中,您可以遍历包含所有文章的实例变量。您的视图应如下所示:

@articles.each do |article|
  article.name
  .
  .
  article.comments.count
end
于 2012-08-29T17:16:47.297 回答
1
@article.comments 

将给出@article 的所有评论。您不需要指定如下

@article.comments.find(:all)

要显示每篇文章的评论数,请执行

%table
  %thead
  %tbody
    - @articles.each do |article|
      %tr
      = article.comments.count

视图是在haml

于 2012-08-29T17:19:59.620 回答