Diciamo che si dispone di un frammento della pagina che visualizza i post più recenti e si scade in 30 minuti. Sto usando Rails qui.Il modo migliore per combinare frammenti e memorizzazione nella cache di oggetti per memcached e Rails
<% cache("recent_posts", :expires_in => 30.minutes) do %>
...
<% end %>
Ovviamente non c'è bisogno di fare la ricerca nel database per ottenere i post più recenti, se esiste il frammento, così si dovrebbe essere in grado di evitare il carico di troppo.
Quello che sto facendo ora è qualcosa di simile nel controller che sembra funzionare:
unless Rails.cache.exist? "views/recent_posts"
@posts = Post.find(:all, :limit=>20, :order=>"updated_at DESC")
end
È questo il modo migliore? È sicuro?
Una cosa che non capisco è il motivo per cui la chiave è "recent_posts
" per il frammento e "views/recent_posts
" al momento del check in seguito, ma mi si avvicinò con questo dopo aver visto memcached -vv
per vedere che cosa stava usando. Inoltre, non mi piace la duplicazione di inserire manualmente "recent_posts
", sarebbe meglio tenerlo in un posto.
Idee?
Mentre penso che la risposta di Lar potrebbe essere un po 'più chiara ed evita l'uso della meta-programmazione, la tua risposta è migliore in quanto l'annuncio è più vicino a MVC. Ho svalutato entrambi come validi, ma lascerò decidere alla comunità (non ne sceglierò uno come accettato :) Grazie! –
Sono d'accordo e trovo anche questa una bella soluzione. Per quanto riguarda il riutilizzo della vista, sì in generale è un buon principio. Dovresti lasciare che il controller fornisca la chiave di cache, anche se per farlo funzionare qui. A proposito, curiosamente, la documentazione API sulla cache dei frammenti viola il principio MVC nel primo esempio: http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html –