0

さて、私はレールクエリについて混乱しています。例えば:

Affiche belongs_to :place
Place has_many :affiches

今すぐこれを行うことができます:

@affiches = Affiche.all( :joins => :place )

また

@affiches = Affiche.all( :include => :place )

多くのアフィッチがある場合、多くの余分な SELECT を取得します。

Place Load (0.2ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 3 LIMIT 1
Place Load (0.3ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 3 LIMIT 1
Place Load (0.8ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 444 LIMIT 1
Place Load (1.0ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 222 LIMIT 1
...and so on...

そして (sic!) :joinsused everySELECTは 2 倍になります!

技術的には、クラウドは次のように記述します。

@affiches = Affiche.all( )

結果はまったく同じです!(関係が宣言されているため)。すべてのデータを 1 つのクエリに保持する方法は、リレーションを削除して「LEFT OUTER JOIN」で大きな文字列を書き込むことですが、それでもデータを多次元配列にグループ化する問題や、id.

何が間違っていますか?または、私は何を間違っていますか?

アップデート:

さて、私はその文字列Place Load (2.5ms) SELECT "places".* FROM "places" WHERE ("places"."id" IN (3,444,222,57,663,32,154,20))と選択のリストを1つずつ持っていますideach奇妙ですが、スコープ内でこれを行うと、これらの個別の選択が得られます。

 <%= link_to a.place.name, **a.place**( :id => a.place.friendly_id ) %>

マークされa.placeているのは、これらの追加のクエリを生成するスポットです。

更新 2:

そして、私にいくつかの計算をさせてください。コンソールには次のものがあります。

 Affiche Load (1.8ms)  SELECT affiches.*, places.name FROM "affiches" LEFT OUTER JOIN "places" ON "places"."id" = "affiches"."place_id" ORDER BY affiches.event_date DESC
 <VS>
 Affiche Load (1.2ms)  SELECT "affiches".* FROM "affiches"
 Place Load (2.9ms)  SELECT "places".* FROM "places" WHERE ("places"."id" IN (3,444,222,57,663,32,154,20))

結果: 1.8 ミリ秒と 4.1 ミリ秒、かなり紛らわしいです...

4

1 に答える 1

2

:includeオプションはすべてのアフィッシュから属性を収集place_idし、次のような選択クエリを使用してすべての場所を一度に取得することを目的としているため、ここで何かが本当に奇妙です:

select * from places where id in (3, 444, 222)

Railsコンソールで確認できます。それを開始してそのスニペットを実行するだけです:

ActiveRecord::Base.logger = Logger.new STDOUT
Affiche.all :include => :place 

コードのどこかに実際に場所を含めずに、偶然にもアフィッシュをフェッチしている可能性があります。すべてのアフィシェの場所を呼び出して、レールを作成し、それらのすべてに対して個別のクエリを実行している可能性があります。

于 2011-11-19T17:23:18.350 に答える