2015-02-23 26 views
0

我的应用程序检索一组的每个职位的标签,但由于某种原因它正在运行重复查询:Rails的运行重复查询

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

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 

,以保持它的简单我在视图页面代码

这里是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 

我不明白的是为什么它第1W运行一个查询没有order_by,然后用它运行查询。性能还不错还有,但是如果它真的在为每个帖子运行两个查询,那么它可能会变得非常快。

+1

我认为,如果你提供的方法“print_tags”这将是有益的。 我认为一个更好的做法是将帖子加载为块。而不是@ posts.each do | post | ...结束,可能更好的方法是@ posts.include(:tags).order('tags.created_at desc')或类似的东西。可能会导致只有1个数据库查询,而不是每个帖子1查询。 *未经测试的代码* http://apidock.com/rails/ActiveRecord/QueryMethods/includes – Mingsheng 2015-02-23 06:47:43

+0

您是否在其他地方使用post.tags? – 2015-02-23 07:11:26

+0

是的,我似乎也在某处使用了post.tags.length。尽管使用急切加载似乎解决了这个问题。谢谢! – user3822741 2015-02-23 07:22:35

回答