0

我在帖子控制器中有一个索引操作,该视图显示所有帖子以及每个帖子之后的评论。我当前的实现是,在嵌入的 html 文件中,在@posts.each do |p|p.comments用来获取每个帖子的所有评论的块中。但是,仅在视图中执行此操作似乎并不好,但我无法在控制器中找到执行此操作的方法。任何人都可以提供一些建议吗?或者这只是正确的方法吗?

4

2 回答 2

4

在您的控制器中,当您查询帖子时,使用includes(:comments)将 SQL 查询的数量从 1+n 减少到 2:

@posts = Post.includes(:comments).where(......)

您可以将代码原样保留在视图中,p.comments不会触发更多 SQL 查询。

查看教程Eager loading associations

于 2013-06-20T01:36:49.060 回答
0

Arie 擅长解决 n + 1 问题。在视图方面,您仍然可以使用相同的方法,但最好使用集合部分:

# posts/index.html.erb
<%= render @posts %>

这将寻找位于的部分/views/posts/_post.html.erb作为向其发送post变量。它将对@posts数组中的每个 Post 模型执行此操作。

对于评论,_post.html.erb您可以写:

# /views/posts/_post.html.erb
<% # Post content here %>
<%= render post.comments %>

就像帖子集合一样,将使用位于的部分呈现每个评论/views/comments/_comment.html.erb

有关更多详细信息,请查看导轨指南

于 2013-06-20T01:46:13.477 回答