一个用户可以有很多帖子,每个帖子可以有很多评论。访问用户的个人资料时,您会在视图中获得如下呈现的帖子列表:
<%= render @posts %>
我还想通过执行以下操作来呈现每个帖子的评论:
<%= render @comments %>
但是,我会在哪里声明@comments?如果我在 user#show 中声明它,那么我会得到用户的所有评论,而不是特定帖子的评论。
那么当一个集合被渲染时,它会访问每个实例的控制器吗?如果是这样,它使用什么控制器方法?
一个用户可以有很多帖子,每个帖子可以有很多评论。访问用户的个人资料时,您会在视图中获得如下呈现的帖子列表:
<%= render @posts %>
我还想通过执行以下操作来呈现每个帖子的评论:
<%= render @comments %>
但是,我会在哪里声明@comments?如果我在 user#show 中声明它,那么我会得到用户的所有评论,而不是特定帖子的评论。
那么当一个集合被渲染时,它会访问每个实例的控制器吗?如果是这样,它使用什么控制器方法?
您可以在帖子部分中呈现每个帖子的评论:
<% @posts.each do |post| %>
<%= render post %>
<%= render :partial => 'posts_comments', :collection => post.comments %>
<% end %>
这不会在每个post.comments
语句上发送到控制器,它只是查询数据库。
您还可以通过以下方式在控制器中设置 @posts 实例变量来消除多个查询:
@posts = @user.posts.includes(:comments)
然后当你这样做时,post.comments
它不会查询数据库,而是从内存中加载评论。