Due cose che vorrei notare. Innanzitutto, probabilmente non vuoi eseguire questa query ogni volta che esegui il rendering di qualsiasi pagina nella tua applicazione. Sicuramente vuoi mettere in cache i tuoi MenuItem. In secondo luogo, potrebbe essere utile inserire un metodo di convenienza nella classe MenuItems per memorizzare questo valore nella cache. Quindi, se io definisco un metodo
def MenuItem.all_for_menu
@@all_for_menu ||= MenuItem.find(:all) #returns value if exists, or initializes it
end
posso chiamare MenuItem.all_for_menu nel mio layout e ottenere tutte le voci di menu. Se mai ne aggiungi uno nuovo o ne modifichi uno, dovresti invalidarlo.
Un altro approccio caching sarebbe quello di mettere i dati in un parziale e memorizzare nella cache quel frammento utilizzando la chiamata standard con cache:
<% cache(:controller => "menu_items",
:action => "list",
:action_suffix => "all_menu_items") do %>
<%= render :partial => "menu", :collection => MenuItem.all_for_menu %>
<% end %>
È quindi possibile scadere quel frammento chiamando:
expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items")
dispiace vorrei chiarire. Non intendo in una vista, voglio dire visualizzarli in un layout. – puttputt