在索引视图问题中渲染'belongs_to' - Ruby on Rails

时间:2010-04-12 15:49:42

标签: ruby-on-rails ruby

我用Ruby on Rails创建了一个简单的博客应用程序。应用程序包含两个表,帖子和注释。评论belongs_to :post和帖子has_many :comments

我使用以下列创建了帖子表:title:stringbody:text。 我使用以下列创建了评论表:body:text post_id:integer name:string email:string

在/views/comments/index.html.erb显示中,我想显示所有评论的列表以及帖子标题。目前,索引视图仅显示post_id,正文,名称,电子邮件。

如何将post_id列替换为相应的帖子标题?这是我的代码:

CommentsController索引动作:

  def index
    @comments = Comment.all :order => "created_at DESC"
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @comments }
      format.json { render :json => @comments }
      format.atom
    end
  end

/views/comments/index.html.erb

<h1>Listing comments</h1>

<table>
  <tr>
    <th>Post</th>
    <th>Body</th>
  </tr>

<% @comments.each do |comment| %>
  <tr>
    <td><%=h comment.post_id %></td>
    <td><%=h comment.body %></td>
    <td><%=h comment.name %></td>
    <td><%=h comment.email %></td>
  </tr>
<% end %>
</table>

<br />

3 个答案:

答案 0 :(得分:1)

如果您有100条评论,则使用comments.post.title代码会导致 101 查询!请参阅此文档页面上的Eager loading部分。在这里急切加载会将其减少到 2

def index
  @comments = Comment.find(:all, :include => :post, :order => "created_at DESC")
  # ...
end

在您的观看中,您可以访问帖子标题

<%= comment.post.title rescue "No post" %>

修改:我正在使用rescue "No Post",因为您对post_id = nil发表了一些评论,并且post_id的一些评论指向{{1}}不再存在的帖子。

答案 1 :(得分:0)

您只需执行<%=h comment.post.title %>即可输出与评论相关联的帖子的标题。

答案 2 :(得分:0)

试试@ post.comment.title。因为帖子有很多评论属于帖子,那么就是一种父母的孩子关系。