[解決済み] Railsの:includeと:joinsの比較
質問
これは、「やり方がわからない」というより、「なぜこのように動くのか」という質問です。
ということで、使うことが分かっている関連レコードを引っ張ってくる際の福音は
:include
というのも、結合が行われ、余分なクエリの束を回避することができるからです。
Post.all(:include => :comments)
しかし、ログを見ると、ジョインが起こっていません。
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
それは
は
は、すべてのコメントを一度に取得するため、ショートカットを取りますが、それでも結合ではありません(これは、すべてのドキュメントに書かれていることのようです)。結合を得ることができる唯一の方法は
:joins
の代わりに
:include
:
Post.all(:joins => :comments)
とログに表示されます。
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
何か見落としているのでしょうか?私は半ダースの関連付けを持つアプリを持っており、1つの画面にそれらすべてのデータを表示しています。6つの個別クエリではなく、1つの結合クエリにした方が良いように思えますが。パフォーマンス上、個々のクエリよりも結合を行う方が常に良いとは限らないことは承知していますが(実際、消費時間から判断すると、上記の2つの個々のクエリの方が結合よりも速いように見えます)、ドキュメントをすべて読んだ後、次のように表示されていることに驚きました。
:include
が宣伝通りには動かない。
たぶんRails は パフォーマンスの問題を認識し、特定のケースを除いては参加しないのでしょうか?
解決方法は?
どうやら
:include
の機能は、Rails 2.1で変更されました。 Railsはすべてのケースで結合を行っていましたが、パフォーマンス上の理由から、状況によっては複数のクエリを使用するように変更されました。
このブログの記事
Fabio Akita氏による、この変更に関する良い情報があります(「"Optimized Eager Loading"」というセクションを参照してください)。
関連
-
[解決済み】Rails 4 RoutingError: ルートが一致しない[POST]。
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] MySQLの複数左結合
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Railsです。ActiveRecordでデフォルト値を設定するにはどうすればよいですか?
-
[解決済み] Rails 4: 利用可能なデータ型のリスト
-
[解決済み] Rails update_attributes without save?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] どなたか、collection_selectをわかりやすく説明していただけませんか?
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?