我在帖子控制器中有一个索引操作,视图会在每个帖子后显示所有帖子及其评论。我目前的实现是,在嵌入式html文件中,在@posts.each do |p|
块中,我正在使用p.comments
来获取每篇帖子的所有评论。但是,仅在视图中执行此操作似乎并不好,但我无法在控制器中找到这样做的方法。谁能提出一些建议?或者这只是正确的方法吗?
答案 0 :(得分:4)
在您的控制器中,当您查询帖子时,使用includes(:comments)
将SQL查询的数量从1 + n减少到2:
@posts = Post.includes(:comments).where(......)
您可以将视图保留在视图中,p.comments
不会触发更多SQL查询。
答案 1 :(得分: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
有关详细信息,请查看rails guide