Я хотел бы отметить две вещи. Во-первых, вы, вероятно, не хотите делать этот запрос каждый раз, когда вы отображаете какую-либо страницу в вашем приложении. Вы определенно хотите кешировать свои 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")