2012-03-13 2 views
0

Я запускаю Ruby on Rails 3.1. Я запрашивая базу данных для того, чтобы восстановить объекты статьи, которые имеют не категории отношений с пользователем и я пытаюсь улучшить следующий код:Как улучшить следующий запрос к базе данных?

article_relationship_ids = 
    User.article_category_relationships 
    .uniq_by{|article_category_relationship| article_category_relationship.article_id} 
    .map(&:article_id) 

user.articles.where("articles.id NOT IN (?)", article_relationship_ids) 

Как я могу улучшить приведенный выше код?

P.S.: Является ли мой «подход поиска» «логически» правильным, чтобы сделать то, что я хотел бы?

+0

Что случилось с ним? Почему вы хотите улучшить? –

+0

@ Сергио Туленцев - Я уверен, что есть что улучшить, в основном по соображениям производительности. Например, метод 'uniq_by' запускается после выполнения запроса и, возможно, есть способ сделать это на« уровне базы данных », чтобы загрузить меньше записей ... * как? * – Backo

+2

Как правило, плохая идея явно оптимизируйте производительность, не зная, как данный код действительно выполняет. Запустите фактические тесты, и если код на самом деле является узким местом, то оптимизируйте. –

ответ

1

Это должно принести ваши идентификаторы без дальнейшей обработки на стороне рубина:

article_relationship_ids = 
    User.article_category_relationships.select(:article_id).uniq 
+0

Метод 'uniq' не работает должным образом. – Backo

+0

[руководство указывает на другое] (http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields). Но если это не сработает, возможно, у вас есть старший AR, который не понимает. Вы можете попробовать «User.article_category_relationships.select (: article_id) .group (: article_id) .map (&: article_id)' – dbenhur

+0

Я использую 'activerecord (3.1.1)', который должен быть одним из самых последних. – Backo

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