Моего приложения получает набор меток на пост, но по какой-то причине он работает дублирующие запросы:Rails работает дубликат запросы
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
и вот мой код print_tags в PostsHelper:
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, а затем запускает запрос с ним. Производительность неплохая еще, но если она действительно запускает два запроса для каждого сообщения, то это может стать уродливым довольно быстро.
Я думаю, что это будет полезно, если вы предоставляете метод «print_tags». Я думаю, что лучшей практикой было бы загрузить сообщения в виде куска. Вместо @ posts.each do | post | ... end, вероятно, лучшим способом будет @ posts.include (: tags) .order ('tags.created_at desc') или что-то в этом роде. Вероятно, это приведет только к одному запросу базы данных вместо 1 запроса для каждого сообщения. * непроверенный код * http://apidock.com/rails/ActiveRecord/QueryMethods/includes – Mingsheng
Вы используете post.tags в другом месте? –
Да, кажется, я тоже использовал post.tags.length. Однако, несмотря на то, что использование загруженной загрузки, похоже, устранило проблему. Спасибо! – user3822741