子クラスのポリモーフィックな親を熱心にロードできません。include ステートメントは違いがないようです。
子クラス:
@BelongsToPolymorphic(
parents = {ParentRequest.class},
typeLabels = {"parent_request"})
public class Child extends Model {
}
親クラス:
public class ParentRequest extends Model {
}
積極的に子 + 親を返す必要があるクエリ:
List<Child> children = Child.where("... limit 500").include(ParentRequest.class);
children.size(); //this gives me 500
children.cachedParents.size(); //this gives me 0;
最終的に、次の操作を高速化しようとしています。
for (Child child : children) {
ParentRequest pr = child.parent();
// lots of pr.getString("parent_field");
...
}
これらの操作をベンチに置いたところ、 Child.where() メソッドで .include(ParentRequest.class) が使用されているかどうかに関係なく、上記の操作は約 67 ミリ秒かかるようです。
洞察や助けをいただければ幸いです。
注: 子には親が 1 つしかないことは承知しています。近い将来、それはいくつかになるでしょう。
編集: クエリを反転すると、いくつかの理由ではるかに高速な結果が得られました。つまり、Children を探して ParentRequest を含めるよりも、ParentRequest を検索して Child を含めた方が、操作ははるかに高速でした。結果で子テーブルをparent_requestテーブルに結合するためにfindBySqlを具体的に実行したことに注意してください。以下に、クエリの詳細を残しました。
List<ParentRequest> parents = ParentRequest.findBySQL("SELECT child.*, parent_requests.* " +
"FROM child JOIN parent_requests ON child.parent_id=parent_requests.id WHERE " +
"RAND()<=? AND (child.metersToA BETWEEN ? AND ?) " +
" AND (child.metersToB BETWEEN ? AND ?) limit ?",
decimation_value,
minDistanceToA, maxDistanceToA ,
minDistanceToB, maxDistanceToB,
MAX_POINTS).include(Child.class);