2つのこと。まず、アプリケーション内の任意のページをレンダリングするたびに、このクエリを実行することは望ましくありません。あなたは間違いなくあなたのMenuItemsをキャッシュしたい。次に、この値をキャッシュするためにMenuItemsクラスに簡易メソッドを配置すると便利です。だから、私がメソッドを定義する場合
def MenuItem.all_for_menu
@@all_for_menu ||= MenuItem.find(:all) #returns value if exists, or initializes it
end
私は私のレイアウトでMenuItem.all_for_menuを呼び出して、すべてのメニュー項目を取得できます。これまでに新しいものを追加したり編集したりするときは、それを無効にする必要があります。
別のキャッシング・アプローチは、部分的にデータを入れて、標準のキャッシュコールを使用してそのフラグメントをキャッシュするようになります:
<% cache(:controller => "menu_items",
:action => "list",
:action_suffix => "all_menu_items") do %>
<%= render :partial => "menu", :collection => MenuItem.all_for_menu %>
<% end %>
その後、呼び出すことによって、そのフラグメントを期限切れにすることができます
expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items")
私は明確にすべき申し訳ありません。ビューではなく、レイアウトで表示することを意味します。 – puttputt