Rails 运行 重复查询

Rails running duplicate queries

我的应用程序根据 post 检索一组标签,但由于某些原因它是 运行 重复查询:

Post Load (0.2ms)  SELECT  `posts`.* FROM `posts`  WHERE `posts`.`user_id` = 1                      
Tag Load (0.2ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 107
Tag Load (0.3ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 107  ORDER BY post_tags.created_at
Tag Load (0.1ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 106
Tag Load (0.2ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 106  ORDER BY post_tags.created_at
Tag Load (0.2ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 105
Tag Load (0.2ms)  SELECT `tags`.* FROM `tags` INNER JOIN `post_tags` ON `tags`.`id` = `post_tags`.`tag_id` WHERE `post_tags`.`post_id` = 105  ORDER BY post_tags.created_at

为了简单起见,我在视图页面中的代码:

@posts.each do |post| 
    # code/html to print out post here
    print_tags(post.tags.order('created_at desc'))
end

这是我在 PostsHelper 中 print_tags 的代码:

def print_tags(tags)

    returnStr = ""
    tags.each do |tag| 
        returnStr += "<span class='tags'><a href='/users/#{@user.id}/tags/#{tag.tag_name.gsub(' ', '-')}'>#{tag.tag_name}</a></span>" 
    end

    returnStr
end

我不明白的是为什么它先运行一个没有 order_by 的查询,然后再运行带有它的查询。性能还不错,但如果它真的是运行 每个post 两个查询,那么它可能会很快变得丑陋。

尝试预先加载您的标签关联:

@posts.includes(:tags).each do |post| 
  # do something with `post.tags`
end

Eager Loading Associations