2017-09-16 13 views
0

私のアプリケーションでは、私は人と服装というモデルを持っています。人々のための私のショーコントローラでは、私はこのようなリストを得る:Rails activerecord - すべての子関連を継承する方法は?

@people = Person.where("description LIKE ?", "%#{params[:description]}%") 

そして、私の見解で私はこのような各人物の衣装を示しています。

<% @people.each do |person| %> 
    <p> Name: <%= person.name %> </p> 
    <% @outfits = person.outfits %> 
    <% @outfits.each do |outfit| 
    <p> Name: <%= outfit.name %> </p> 
    <p> Description: <%= outfit.description %> </p> 
    <% end %> 
<% end %> 

しかし、一人一人のために衣装をロードし、私がページに多くの人を載せると、時間がかかりすぎる。私は一人一人の衣装を継承することができる方法はありますか?ページが読み込まれるまで待つ必要はありませんか?または、これをスピードアップして衣装と人との間のインデックスを作る唯一の方法ですか?

@people = Person.where("description LIKE ?", "%#{params[:description]}%").limit(20) 

変更お好みに応じて数:あなたはこのような制限を設定する必要があります任意の助け

+0

以下の答えは、通話のパフォーマンスを最適化するお手伝いをしますが、あなたはまた、あなたがページネーションのいくつかの並べ替えを追加したり、次第にを表示する能力を有することにより、表示内容を制限しなければなりません。 – s1mpl3

答えて

0

いただきありがとうございます。そうしないとあなたが@peopleを介して各反復は別々のデータベースクエリが衣装を取得するようになりますN + 1クエリ問題と呼ばれるものを持っている

@people = Person.eager_load(:outfits) 
       .where("description LIKE ?", "%#{params[:description]}%") 
       .limit(20) # optional 

2

は、関連レコードをロードするために参加してください。

はい、アソシエーションを作成する列には、外部キーインデックスが必要です。たとえば、outfits.person_idなどです。移行にbelongs_toまたはreferencesマクロを使用すると、デフォルトでこれを行います:あなたは、テーブルを持っている場合は

create_table :outfits do |t| 
    t.belongs_to :person, foreign_key: true 
end 
+0

には、改ページに役立つオフセットがあります。 – s1mpl3

0

あなたは.joinsまたは.includes

を使用することができますPersonでいっぱいで、あなたは:joins =>衣装を使ってすべてを引き出すあなたの服装名、説明などと一緒にPersonを表示したいと言っています。ジョインズを使用するには、次のようにしなければなりません。フェッチした各ユーザーに対して個別のSQL照会を行います。使用した場合は、この情報を組み込みます。使用できる状態になります。

ソリューション

Person.includes(:outfits).where("description LIKE ?", "%#{params[:description]}%") 
+0

結合されたテーブルのデータを使用していることが分かっている場合は、インクルードは2つの別々のクエリを使用するため、 '.eager_load'を使用する方がよいでしょう。 – max

関連する問題