2

これは初心者の質問かもしれません。しかし、私はそれを自分で理解することができませんでした。

私のアプリケーションでは、MongoidとMongoDBでRails3.2.8を使用しています。

私はこのようなインスタンス変数を持っています:

ProgramsController <ApplicationController

@program = Program.find(params[:id])

ビューファイルでは、何度も使用する必要があります。例えば;

@program.title
@program.content
@program.schedules (associated with Schedule model)
@program.articles (associated with Article model)

問題は、ビューのさまざまな部分でそのインスタンス変数を使用する必要があるということです。だから、それはするようなものではありません@program.each do |t| ....

しかし、ビューの別の部分で@programを使用すると、毎回新しいクエリが実行されます...

現在、私の見解について31のクエリがあります。やりすぎではないですか?

では、ベストプラクティスは何ですか?インスタンス変数を効果的に使用するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

0

私はRuby/Railysに特に精通していませんが、一般的にMVCフレームワークでは、データのフェッチはコントローラーによって処理されるため、1回だけ発生します。その後のビューでの使用は、要求のためにメモリにキャッシュされた単一のコピーを使用することになります。ビューの1つのセクションでタイトルを参照し、別のセクションでコンテンツを参照することは、パフォーマンスの問題ではありません。それらは、キャッシュされたオブジェクトのプロパティアクセサーにすぎません。

これを確認するために、リクエストの時間を計測またはモックして、実際に複数回実行されているかどうかを確認できます(疑わしいです)。

于 2012-11-18T15:04:03.627 に答える
0

アイテムがに保存されると@program、実際にそこに保存され、後続のリクエストはクエリを生成しません。@program.titleとへの参照しかない場合@program.contentは、おそらく問題ありません。あなたの問題は、のような協会からのもの@program.schedulesです@program.articles。問題は、スケジュールと記事がからロードされていないこと@program = Program.find(params[:id])です。これはn+1問題と呼ばれます。公式ドキュメントには、 Eager Loadingの下に、それとが記載されEager loaded is supported on all relations with the exception of polymorphic belongs_to associations.ていIn order for eager loading to work, the Identity Map must be enabled.ます。これらの2つの条件が当てはまる場合は、クエリが減少するはずです。これらの要件に対応できない場合は、コントローラーでこのようなことを実行し、1つのクエリですべてを事前に取得することをお勧めします。@schedules = Schedule.find_by(program_id: @program.id)

于 2012-11-18T15:32:38.097 に答える
0

可能であれば、ActiveRecordを使用したいと思います。

Railsの公式ドキュメントによると ::includeオプションを使用して、この関連付けを使用するときに熱心にロードする必要がある2次の関連付けを指定できます。

ここでのスケジュール記事一次協会です。したがって、ActiveRecordを使用している場合は必要ありません。

公式ドキュメントも言う:

即時の関連付けに:include を使用する必要はありません。つまり、注文belongs_to:customerがある場合、顧客は必要なときに自動的に熱心に読み込まれます。

したがって、ActiveRecordを使用している場合は、おそらくこの問題を気にすることはありません。

于 2012-12-19T10:43:37.230 に答える