1

このレール キャストhttp://railscasts.com/episodes/22-eager-loadingを見ましたが、次のようなシナリオで効率的な GET REST サービスを作成する最善の方法について、まだ混乱しています。

組織テーブルがあり、それらの間に関係がある他の 20 ほどのテーブルがあるbelongs_toとします。has_many(したがって、これらすべてのテーブルにはorganization_idフィールドがあります)。

URL でリクエストに渡される組織 ID に基づいて、Rails REST サービスの形式で GET および INDEX リクエストを記述したいと考えています。これらのテーブルに移動して読み取り、JSON を埋めることができますが、それらのテーブルのすべてではありません。たとえば、20 のテーブルすべてではなく、Patients、Orders、および Visits テーブルについて考えてみましょう。

だからまだ私はそのような書き方を理解するのに苦労しています

.find( :all )  

クエリの種類?この種のクエリを実行する方法を理解できるように、誰かが例を示すことができますか?

4

1 に答える 1

2

これらすべてのテーブルを 1 つの SQL クエリに含めることができます。

@organization = Organization.includes(:patients, :orders, :visits).find(1)

今、次のようなことをすると:

@organization.patients

元のクエリですでに患者をフェッチしているため、メモリ内に患者をロードします。がないincludesと、@organization.patients別のデータベース クエリがトリガーされます。これが「eager loading」と呼ばれる理由です。なぜならpatients、組織を実際に参照する前に (eagerly) ロードしているためです。後でそのデータが必要になることがわかっているからです。

includes使う・使わないに関わらずいつでも使えますallincludes個人的には、(Railscast のエピソードのように) ある種のハッシュ オプションとしてメソッドを含めるのではなく、メソッドをモデルに連鎖させると、より明示的かつ明確になることがわかります。

于 2013-02-07T04:26:37.557 に答える