2015-02-23 4 views
0

Моего приложения получает набор меток на пост, но по какой-то причине он работает дублирующие запросы: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, а затем запускает запрос с ним. Производительность неплохая еще, но если она действительно запускает два запроса для каждого сообщения, то это может стать уродливым довольно быстро.

+1

Я думаю, что это будет полезно, если вы предоставляете метод «print_tags». Я думаю, что лучшей практикой было бы загрузить сообщения в виде куска. Вместо @ posts.each do | post | ... end, вероятно, лучшим способом будет @ posts.include (: tags) .order ('tags.created_at desc') или что-то в этом роде. Вероятно, это приведет только к одному запросу базы данных вместо 1 запроса для каждого сообщения. * непроверенный код * http://apidock.com/rails/ActiveRecord/QueryMethods/includes – Mingsheng

+0

Вы используете post.tags в другом месте? –

+0

Да, кажется, я тоже использовал post.tags.length. Однако, несмотря на то, что использование загруженной загрузки, похоже, устранило проблему. Спасибо! – user3822741

ответ

Смежные вопросы