2011-06-18 7 views
1

私はRuby on Rails 3.0.7を使用していますが、データベースのヒットを最小限に抑えようとしています。それを行うために、私はに関連するすべてのArticleオブジェクトをデータベースから検索し、検索されたオブジェクトに対して検索を実行します。パフォーマンス:データベースのヒットを最小限にする

私は何がある:

stored_objects = Article.where(:user_id => <id>) # => ActiveRecord::Relation 

<some_iterative_function_1>.each { |...| 
    stored_object = stored_objects.where(:status => 'published').limit(1) 
    ... 
    # perform operation on the current 'stored_object' considered 
}  
<some_iterative_function_2>.each { |...| 
    stored_object = stored_objects.where(:visibility => 'public').limit(1) 
    ... 
    # perform operation on the current 'stored_object' considered 
} 
<some_iterative_function_n>.each { |...| 
    ... 
} 

stored_object = stored_objects.where(:status => 'published')コードは本当に(私のログファイルには、eachの反復のためのデータベースクエリを実行し、まだ縫い目ので、私はこれを聞いて)データベースをヒットに避けることができますか?いいえの場合、データベースのヒットを最小限に抑えるにはどうすればよいですか?

P .:いくつかの言葉で、私がしたいのは、ActiveRecord::Relation(配列)で作業することですが、whereメソッドはデータベースにヒットするために継ぎ目をつけました。

+0

上記のように*検索​​を実際に行っている場合は、Solrのような検索固有のソリューションを使用する必要があります。 RDBMSやインアプリのソリューションよりも、これを処理する方がはるかに優れています。 – coreyward

+0

私はそこにあるかどうかはわかりませんが、atciverecordを使った私の経験からは、あなたが適切なインデックスを持っている限り、通常はルビコードでほとんどの時間を渡します。 – Schmurfy

+0

@Schmurfy - あなたはもっと明確になりますか? – user502052

答えて

1

Railsには、一度にデータベースのチャンクを取得してから、再度データベースにヒットすることなく行を繰り返し処理する機能があります。

find_eachfind_in_batchesの詳細については、「Retrieving Multiple Objects in Batches」を参照してください。

1

stored_objects(これが実行している場合)を繰り返し開始すると、データベースからロードされます。あなたが唯一のユーザーの出版された論文をロードする場合は、この操作を行うことができます:

stored_objects = Article.where(:user_id => id, :status => 'published') 

をあなたの代わりに未発表の論文を発表し、発表されたものと異なる何かをロードしたい場合は、あなたがこれを行うことができます:

stored_objects = Article.where(:user_id => id) 
stored_objects.find_all { |a| a.status == 'published' }. each do |a| 
    # ... do something with a published article 
end 

それとも:

Article.where(:user_id => id).each do |article| 
    case article.status 
    when 'published' 
     # ... do something with a published article 
    else 
     # ... do something with an article that's not published 
    end 
end 

これらの例のそれぞれは、唯一のデータベースクエリを実行します。どちらのデータを実際にどのデータに依存するかを選択します。

+0

おそらく、いくつかの制限を加えるか、メモリにヒットします。 –

+0

私は、それぞれの 'stored_object'を単独で他の操作で実行することも考慮する必要があります。さらに、私は他のattibute値に基づいて '記事'オブジェクトを見つける必要があります...これは、私はすべての記事をユーザーに関連する検索し、それらのデータベースを毎回打つことなくそれらを処理するようにしたい理由です。 – user502052

+0

多分私はその質問を誤解しました。 Relationの 'where'メソッドは、データベースにぶつかることなく無期限に呼び出すことができますが、結果を調べようとするとすぐに取得する必要があります。 –

関連する問題