0

過去にも苦労した問題を解決しようと、数日間ぐるぐる回っています。基本的に、ページの読み込みが非常に遅いことが定期的にわかっているため、モデルに対して複数のクエリを実行するための最良の (または効率的な) 方法を理解することが問題です。

というモデルがある状況を考えてみましょうEverythingEverything最初に、特定の基準に一致するレコードを検索するクエリを実行します

@chosenrecords = Everything.where('name LIKE ?', 'What I want').order('price ASC')

の内容をリストとしてユーザーに提示するので覚えておきたいのですが、たとえば@chosenrecordsの属性についてもっと理解したいと思います@chosenrecords

@minimumprice = @chosenrecords.first
@numberofrecords = @chosenrecords.count

コントローラーで上記のコードを使用し、ローカル サーバーでコマンド履歴を調べると、返されたレコードを記憶してクエリを実行するのEverythingではなく、3 つのクエリのそれぞれが元のモデルの SQL クエリを含んでいることに驚きました。@chosenrecordsその上で。これは私には非常に非効率に思えます。実際、3 つのクエリの処理にかかる時間は同じであり、ページのパフォーマンスが低下します。

私は、MATLAB のようなソフトウェアでコードを書く経験が豊富です。変数の値を計算すると、ローカルに保存され、その変数についての詳細情報を知りたい場合にその変数を再計算するのではなく、すぐに調べることができます。私が完全に間違った方向に進んでいるだけなのか、私が特定した問題は単に「Rails の状態」なのか、それとも改善するために何かできることがあるかどうかを教えてください。スコープの使用、異なる変数型の定義、キャッシングなどの概念を調べましたが、それぞれの場合で何をしているのかよくわからず、同様の穴に陥り続けています。

御時間ありがとうございます

4

1 に答える 1

1

あなたは部分的に間違った方向に進んでいます。Rails 3 には Arel が付属しており、データが必要になるまでクエリを延期します。あなたの場合、Arel クエリを生成しましたが、それを .first & then .count で実行しました。ここで行ったことは、最初のクエリを実行し、配列内のすべての結果を取得して、次の 2 行でその配列を操作することです。

次のようなクエリを実行します:-

@chosenrecords = Everything.where('name LIKE ?', 'What I want').order('price ASC').all

@minimumprice = @chosenrecords.first
@numberofrecords = @chosenrecords.size

それはあなたの問題を解決します。

于 2013-09-15T11:16:43.363 に答える