优化sql查询rails

kir*_*rqe 1 sql activerecord ruby-on-rails

在帖子索引页面上,我以这种方式列出所有帖子:

posts_controller.rb

def index
  @posts = Post.includes(:comments).paginate(:page => params[:page]).order("created_at DESC")
end
Run Code Online (Sandbox Code Playgroud)

index.html.erb

 <%= render @posts %>
Run Code Online (Sandbox Code Playgroud)

_post.html.erb

<%= gravatar_for post.user, size:20 %>
<%= link_to "#{post.title}", post_path(post) %>
<%= time_ago_in_words(post.created_at) %> 
<%= post.comments.count %>
<%= post.category.name if post.category %>
Run Code Online (Sandbox Code Playgroud)

每页35个帖子

当我第一次在dev env中加载页面时,rack-mini-profiler显示此时间:1441.1 ms

几次重载后:~700 ms

我可以以某种方式减少这个时间和sql请求的数量?

如果它有帮助,这里是rmp图像:

在此输入图像描述

在此输入图像描述

Fre*_*ung 5

您可以通过以下方式减少sql查询的数量:

  • 包括user以及comments,因为你似乎在显示gravatar时使用它

  • post.comments.countpost.comments.size

虽然大小,计数,长度是数组的同义词,但对于活动记录关系或关联,它们并不相同:

  • length 加载关联(除非它已经加载)并返回数组的长度
  • count做了select count(*) query该协会是否加载与否
  • sizelength如果加载关联则使用,count如果不加载则使用.

在您的情况下,注释关联已加载,但因为您正在使用count,它实际上并未使用