2012-04-10 11 views

答えて

41

Eager Loading

一つの方法は、SQLクエリの数を削減することです。熱心な読み込みでこれを行うことができます。すべてのユーザーの

1)ワン:

User.find(:all, :include => :friends) 

ここでは、唯一の2つのクエリを発射しています。

2)ユーザーのすべての友人に1人。

Lazy Loading

あなたはユーザー多くの友人を持っており、あなたは友人と同数のクエリを発射、プラスオブジェクトの1のOrkutのようにリストを表示するなどの多くのオブジェクトに関連付けられたオブジェクトを持っています自体。ここで

users.each do |user| 
    friend = Friend.find_by_user_id(user.id) 
end 

1)すべてのユーザーのための一つのクエリ:

users = User.find(:all) 

は次にように、各ユーザーの友人のために照会します。

2)ユーザーの友人。あなたがこれを理解するのに役立ちますRails 3: Lazy loading versus eager loading

希望:

は上を見てみましょう。

+8

チェックこの同様:http://www.spritle.com/ブログ/ 2011/03/17/eager-loading-and-lazy-loading-in-rails-activerecord/ – Vik

+2

Vik素敵で清潔な説明.. –

+3

レイジーローディングは熱心なローディングを使用しないのと同じではありません。 ''レイジーローディングは、オブジェクトの初期化を必要な時点まで遅らせるために、コンピュータプログラミングで一般的に使用されるデザインパターンであり、適切かつ適切に使用されると、プログラムの動作の効率化に貢献できます。 - ウィキペディア ' 基本的に、ページには、ユーザーがスクロールするまで表示されないイメージの束がある場合、スクロールしてイメージを表示して読み込むまで待つことができます。それは怠惰な読み込みです。 –

5

イーガーロード

は(ビックスバーグのように)あなたの銃をロードし、あなたが実際にそれを使用する必要があるまで待つだけ。これは熱心なロードの方針です。

プロ:すべてが準備完了です。

Con:スペース/メモリを使い果たしています。

遅延ロード

彼は彼の船を準備しなかった理由の若い海軍士官候補生は、ロードネルソンを尋ねた:

「私は「.......早く私の銃をロードしません私はそれを発射する必要がある前にちょうど1マイクロ秒をロードするでしょう。彼は言った。 これは遅延読み込みポリシーです。

怠惰な読み込みのプロ:あなたが必要になるまでデータベースをヒットしません。

Con:正確に列を選択してエイリアスにしない限り、データベースをN + 1回押すことになります。例えば遅延ロードのポリシーに一度だけのデータベースを押す

@products = Product.order("categories.name").joins(:category) 

:あなたは、ビューテンプレートにproduct.category.nameを呼び出すとき

上記のクエリは、データベースN + 1回に当たる - 製品がどこにありますか@productsの関係にある単一のオブジェクト。あなたはそれをエイリアス場合しかし、あなたはすべてがひとつのクエリで成し遂げることができます。

@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name") 

そして、このようにそれを使用します。product.category_name

関連する問題