大規模なプロジェクトですべてのクエリを実行して、すべてのオブジェクトの関連付けを熱心にロードするのは、どの時点で適切ですか?
この質問の背景を説明しましょう。
現在、モデルと関連付けの点で非常に複雑になっているプロジェクトに取り組んでいます。サーバーログの確認を開始したところ、クエリにネストされたオブジェクトが含まれているため、一部のビューの読み込みに時間がかかっていることがわかりました。
だから私はこれらのクエリのいくつかを次のようなものにリファクタリングし始めます:
@process = current_account.processes.query(params)
これに:
@process = current_account.processes.includes(:messages, :parts, :people).query(params)
結果はかなり良かった。一部のビューでは、ビューのレンダリング時間とactiverecordのクエリ時間を70%短縮できました。
男は幸せだったので、もっと作ることにしました。しかし、この決定の後、コードをリファクタリングしたすべての場所ではなく、変更が適切であることに気付き始めました。実際、遅くなったクエリがありました。
問題についてもう少し説明するために、私はこのようなモデルを持っています:
class Process
has_many :anotations
has_many :publications
has_many :movimentations
has_many :reunions
has_many :profiles
...
そして、その中のこれらのネストされたモデルのそれぞれは、次のprocess
belongs_to :user
ようにそれを作成しました:
class Anotation
belongs_to :user
class Reunion
belongs_to :user
class Profile
belongs_to :user
そしてそれは続く。
私show view
のには、これらのネストされたオブジェクトのすべてと、それを現在のプロセスに追加したユーザーの名前をprocess
表示するいくつかのタブがあります。
このようなクエリで:
@process = current_account.processes.query(params)
パフォーマンスが少し遅いです。だから私はこのようなことを試みました:
@process = current_account.process.includes(:anotations, :publications, :movimentations,
:reunions, :profiles, :messages).query(params)
これにより、ビューレンダリングの速度が向上しましたが、activerecordでは、これらのオブジェクトを取得する時間が大幅に増加しました。user
そして、私がこのようなすべてのネストされたモデルの中にオブジェクトを熱心にロードしたとき、それは空に上がりましたprocess
:
@process = current_account.process.includes({:anotations => [:user]},
{:publications => [:user], etc...).query(params)
さて、これらの関連付けで異なる動作をするようにアプリのデザインをリファクタリングすることは起こらないので、もう一度質問します。
大規模なプロジェクトですべてのクエリを実行して、すべてのオブジェクトの関連付けを熱心にロードするのは、どの時点で適切ですか?
このテーマに関するヒント/ベストプラクティス/経験をいただければ幸いです。