1

@teachers = User.joins(:students).where("student_id IS NOT NULL")

上記は機能しますが、以下は機能しません。

@teachers = User.includes(:students).where("student_id IS NOT NULL")

私が理解している限り、結合とインクルードはどちらも同じ結果をもたらし、パフォーマンスが異なるはずです。これによるincludesと、Modelによって呼び出されたオブジェクトの関連レコードをロードするために使用します。ここでjoins、2つのテーブルを単純に追加します。を使用includesすると、を防ぐこともできますN+1 queries

最初の質問:コードの2行目が機能しないのはなぜですか?

2番目の質問:includes上記のような場合、誰かが常に使用する必要がありますか?

4

1 に答える 1

1

結合されたモデルに対してクエリを実行する場合は、結合を使用します。これは、テーブル間の内部結合を実行しています。

含まれるのは、関連するモデルを最終結果に熱心にロードしたい場合です。
これにより、dbルックアップを再度実行しなくても、任意の結果で関連付けを呼び出すことができます。インクルードを介してロードされたモデルに対してクエリを実行することはできません。それに対してクエリを実行する場合は、結合を使用する必要があります(両方を実行できます!)

于 2013-01-20T16:04:28.170 に答える