2011-02-03 2 views
2

Foo型のモデルで、Bar型の子レコードが多数ある場合は、Fooレコードのリストを表示して、子バーの数を表示できます記録。だから、私のようなものがあります...DataMapper集計でN + 1を避ける方法

@foos.each do |foo| 
    puts foo.name 
    puts foo.bars.count 
end 

私の集計でN+1 problemを避けるにはどうしたらいいですか?言い換えれば、私は各行に対して新しいSELECT COUNT(*)...クエリを望んでいません。単純にSQLビューを作成して新しいモデルにマップすることはできますが、より簡単なアプローチはありますか?

答えて

1

DataMpperはこれらのことについて気まぐれですので、実際のコードがどのように見えるかに応じて動作する可能性のあるいくつかのオプションを提供します。

  1. countをsizeに変更するだけです。すなわち、foo.bars.sizeを挿入します。 DMの戦略的な積極的なローディングは、このアプローチでうまくいく場合があります。

  2. @ foos.eachループの前に熱心に負荷をかけ、に変更し、サイズをに変更します。

    @foos = Foo.all(...) 
    @foos.bars.to_a 
    @foos.each do | foo | 
        puts foo.name 
        puts foo.bars.size 
    end 
    
  3. 食品idでハッシュに#mapたもの、FOO IDとバー数と構造体を返すあなたの@ foos.eachループの前に生のSQLクエリを発行し、ループ内でそれらを得ます。 (私はこのレベルのナンセンスに1回か2回しか頼らざるを得ませんでしたが、それ以前には1位と2位にしておくことをお勧めします)

関連する問題