2016-09-09 1 views
0

はいくつかの方法I熱心な負荷の開始レコードと、このようなそれに関連する子どもであれば...理解しようとする:関連する子レコードを読み込もうと思えば、それは将来のWHERE検索でデータベースをもう一度掘り下げることはないでしょうか?

@object = Object.include(:children).where(email:"[email protected]").first 

その後、それは後に、私は、そのオブジェクトの子に目を通す必要がある場合という意味ではありませんこれはデータベースのクエリを生成しませんか?

すなわち、

@found_child = @object.children.where(type_of_child:"this type").first 

答えて

0

残念ながらいない - などwhereとして使用してはActiveRecord ::関係法は、再びデータベースを照会します。

ただし、標準的な配列/列挙方法を使用して、任意の更なるクエリせずにデータをフィルタリングすることができます:

@object.children.detect {|child| child.type_of_child == "this type"} 
+0

ああ...私はまだ(完全な文は '@のobject.children.whereを読み取るためWHERE'は'使用している理由type_of_child: "this type")。pluck(:amount).inject(:+) 'しかし、私は、標準のArrayメソッドを使ってその複製を行うことはできないと思いますか? – james

+0

あなたはpluckではなくnapを使用しますが、ほぼ同じでしょう –

0

それはあなたのケースでは、別のデータベースクエリを生成します。

N + 1個のクエリを避けるために熱心な読み込みが使用されます。これは、関連するすべてのオブジェクトをロードすることによって行われます。しかし、後でwhereでそのリストをフィルタリングしたいときにはこれはうまくいかず、Railsは新しいクエリをビルドして実行します。

あなたの例では、includeは、関連付けられたオブジェクトを読み込むが使用できないため、実際にはコードの実行速度が遅くなります。

私はあなたに例を変更します:私はこれを恐れていた

@object = Object.find_by(email: "[email protected]") 
@found_child = @object.children.find_by(type_of_child: "this type") 
関連する問題