これは、1年前の質問と変更に関連しています。
sqlite3が利用可能であれば、箱から出してすぐに機能するはずの質問の例を示します:https ://github.com/cairo140/rails-eager-loading-counts-demo
インストール手順(メインブランチ用)
git clone git://github.com/cairo140/rails-eager-loading-counts-demo.git
cd rails-eager-loading-counts-demo
rails s
私はリポジトリにもっと完全な記述を持っていますが、私の一般的な質問はこれです。
全体的なデータベースクエリを最小限に抑える方法で、Railsの負荷カウントを熱心に行うにはどうすればよいですか?
ActiveRelationにその関連付けを含めたにもかかわらず、関連付けでn+1
使用するたびに問題が発生します。回避策はを使用することですが、これは、呼び出されているオブジェクトがすでにロードされている場合にのみうまく機能します。もちろん、Railsの内部ですでに行われていることと重複していると思われます。また、使用に関する問題は、関連付けが最初にロードされておらず、カウントが必要なすべてである場合に、不幸なオーバーロードが発生することです。#count
#includes(:associated)
#length
#length
READMEから:
すでにロードされているposts配列(付録を参照)で#lengthを実行することでこの問題を回避できますが、カウントもすぐに利用できるようにしておくと便利です。一貫性が高いだけでなく、投稿をロードする必要がないアクセスパスを提供します。たとえば、何があってもカウントを表示するパーシャルがあるが、半分の時間、パーシャルは投稿がロードされた状態で呼び出され、半分の時間はロードされていない場合、次のシナリオに直面します。
- 使用する
#count
- 投稿がすでに読み込まれている場合のn
COUNT
スタイルのクエリCOUNT
投稿がまだロードされていない場合のnスタイルのクエリ- 使用する
#length
- 投稿がすでに読み込まれている場合、追加のクエリはゼロです
*
投稿がまだロードされていない場合のnスタイルのクエリこれらの2つの選択肢の間には、支配的な選択肢はありません。ただし、次のシナリオを実行できるように、#countを修正して#lengthに延期するか、バックグラウンドで保存されている他の方法で保存されている長さにアクセスすると便利です。
- 改訂版を使用
#count
- 投稿がすでに読み込まれている場合、追加のクエリはゼロです
COUNT
投稿がまだロードされていない場合のnスタイルのクエリ
では、ここでの正しいアプローチは何ですか?私が見落としているものはありますか(非常に、非常に可能性が高いです)?