在控制器级别高效查询所有帖子的评论?

时间:2013-06-20 01:32:04

标签: ruby-on-rails ruby model-view-controller rails-activerecord

我在帖子控制器中有一个索引操作,视图会在每个帖子后显示所有帖子及其评论。我目前的实现是,在嵌入式html文件中,在@posts.each do |p|块中,我正在使用p.comments来获取每篇帖子的所有评论。但是,仅在视图中执行此操作似乎并不好,但我无法在控制器中找到这样做的方法。谁能提出一些建议?或者这只是正确的方法吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

查看教程Eager loading associations

答案 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