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,然后用它运行查询。性能还不错还有,但是如果它真的在为每个帖子运行两个查询,那么它可能会变得非常快。
我认为,如果你提供的方法“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
您是否在其他地方使用post.tags? – 2015-02-23 07:11:26
是的,我似乎也在某处使用了post.tags.length。尽管使用急切加载似乎解决了这个问题。谢谢! – user3822741 2015-02-23 07:22:35