2012-03-13 10 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

@Sergio Tulentsev - パフォーマンス上の理由から、改善の余地があると確信しています。例えば、クエリが実行された後に 'uniq_by'メソッドが実行され、それが"データベースレベル "になってレコードを少なくロードする方法があるかもしれません... *どのように?* – Backo

+2

一般的に明示的には悪い考えです与えられたコードが実際にどのように実行されているかを知らないときのパフォーマンスを最適化します。実際のベンチマークを実行し、コードが実際にボトルネックになっている場合は、最適化します。 –

答えて

1

これは、Ruby側でさらに処理することなく、あなたのIDを取得する必要があります

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があります。 – dbenhur

+0

私は 'activerecord(3.1.1)'を使用しています。これは最新のものでなければなりません。 – Backo