私のビューには次のコードがあります。
<% 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 メソッドを与えるだけで、ビュー。