さて、私はレールクエリについて混乱しています。例えば:
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!) :joins
used 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つずつ持っていますid
。each
奇妙ですが、スコープ内でこれを行うと、これらの個別の選択が得られます。
<%= 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 ミリ秒、かなり紛らわしいです...