1

私のビューには次のコードがあります。

<% if @user.get_products.any? %>
  <%= f.select('products', @user.get_products.collect { |user| [user.name, user.id]}) %>

DBへget_productsのクエリを作成している場所。ActiveRecordそれで、実際に2つの同じクエリを実行するのか、2番目の呼び出しで最初のクエリからキャッシュされた結果を使用するのだろうか? サーバーログで確認しようとしましたが、何も見つかりませんでした。また、この動作を何らかの方法で制御できるかどうか、つまり、このビューのキャッシュを設定/設定解除できるかどうかも知りたいです。

ありがとう!

アップデート:

MVCにも違反していると思いますが、私を混乱させたのはIDEの警告でした:「view should not share more than two variables with controller.」

ただし、やや「1ページ」のWebサイトを作成しているため@user、 、@nearest_users、および@user_productsが同じビューにある必要があります。そこで、次の記事を見つけました:
http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist#instances

言った

各コントローラーとビューの間で共有されるインスタンス変数は 1 つまたは 2 つだけです。

インスタンス変数地獄 - 多くのインスタンス変数がコントローラーとビューの間で共有されている場合 - Rails では簡単に実行できます。また、知らないうちに関連付けに対して重複した呼び出しを行う可能性があるため、パフォーマンスが低下する可能性もあります。代わりに、コントローラーは 1 つのインスタンス変数のみを管理する必要があります。このようにして、関連付けへのすべての呼び出しが「オンデマンド」でロードされ、1 つの場所でインスタンス変数キャッシュすることができます。

この方法は、実際に関連付けをロードする前にビューでキャッシュをチェックできるため、フラグメント キャッシュにも適しています。

たとえば、Blog コントローラーで @post と @related_posts の両方のインスタンス変数を作成する代わりに、単一のメソッド @post を作成し、Post モデルに related_posts メソッドを与えるだけで、ビュー。

4

1 に答える 1

2

質問に答えるには:ビュー内のクエリはキャッシュされません。

さらに、ERB テンプレートの Ruby コードは を使用して実行されますがeval、これは非常に非効率的です。

したがって、私のアドバイスは次のとおりです。ビューでロジックを書くことは避けてください。それは一種の悪い習慣です。

于 2013-04-15T07:23:43.770 に答える