Memcached e Rails caching dei frammenti di Emissione
-
02-10-2019 - |
Domanda
Quando Ho 2 viste che frammento di cache stessa interrogazione ma lo schermo in modo diverso, c'è solo un frammento ed entrambi visualizzazione allo stesso modo. C'è un modo per aggirare questo? Per esempio ...
#views/posts/list
- cache(@posts) do
- for p in @posts
= p.title
#views/posts/list_with_images
- cache(@posts) do
- for p in @posts
= p.title
= p.content
= image_tag(p.image_url)
#controllers/posts_controller
def list
...
@posts = Post.all
end
def list_with_images
...
@posts = Post.all
end
Soluzione
È necessario utilizzare una chiave di cache unica. Se semplice passaggio in un oggetto che chiama il metodo cache_key
su di esso per determinare la chiave. Se si passa in un array di oggetti, cache
genererà una chiave unendo le chiavi della cache di tutti gli elementi dell'array. È possibile utilizzare questo per risolvere il problema attraverso:
#views/posts/list
- cache([:list, @posts]) do
- for p in @posts
= p.title
#views/posts/list_with_images
- cache([:list_with_images, @posts]) do
- for p in @posts
= p.title
= p.content
= image_tag(p.image_url)
Altri suggerimenti
ho capito.
Prima di tutto, il punto centrale di questa strategia è quello di utilizzare le chiavi della cache intelligenti rotaie, che auto-generano chiavi univoche in base al nome del modello, ID, e updated_at attributi.
Che cosa succede se si dispone di contenuti che fa riferimento a due modelli? C'è una convenzione per questo built-in, è sufficiente utilizzare un array:
- cache([@posts, @user]) do
E questo solo aggiunge una chiave utente alla chiave post, in modo che, se o viene aggiornata la cache scade automaticamente. È possibile utilizzare questa stessa convenzione per aggiungere ulteriori informazioni alla chiave sotto forma di una stringa pianura. Questo è utile per distinguere tra i frammenti che attingono alla stessa query, ma richiedono diversi punti di vista, ed è la risposta alla domanda di cui sopra.
- cache([@posts, "lists"]) do
e poi l'altro uso pagina
- cache([@posts, "list_with_images"]) do
e questo creerà due frammenti separati che non saranno confusi con l'altro.