0

私は頻繁にこの状況に遭遇します。

post_comments = post.comments
#grabs maybe 3 records out of thousands in the table
do_something_with post_comments

#...later in the same request...

subset_of_comments = post_comments.where(:awesome=>true)
#hits the database again :-(
do_something_else subset_of_comments

データベースはレコードの検索に非常に優れていることはわかっていますが、テーブル全体に戻って何千ものレコードを調べる方が、この投稿に添付されている、すでにキャッシュされている1つのレコードの小さなセットを検索するよりも優れているとは思いません。または2つ必要です。

このプロセスの効率を改善したい場合はどうすればよいですか?

4

2 に答える 2

1

はい。AR:Relation を初めてロードすると、すべてのレコードがキャッシュされます。ただし、別のリクエスト.where()などを渡すと、クエリを再度プルします。キャッシュされたレコード内を検索する場合は、送信せず、配列メソッド.whereで操作するだけです。

# second 'request':
subset_of_comments = post_comments.map {|comment| comment if comment.awesome == true}.compact

配列メソッド: .find- 最初に一致した 1 つのレコード。.mapまたは.collect- コレクション用

コメント オブジェクトには、「すばらしい」パブリック リーダーが必要です。

于 2012-12-13T16:27:34.207 に答える
0

select メソッドを使用できます。

subset_of_comments = post_comments.where(:awesome=>true)
# becomes
subset_of_comments = post_comments.select{ |pc| pc.awesome == true }

ドキュメント配列 (Ruby 1.9.3)、#selectメソッド

于 2012-12-13T16:44:55.993 に答える