2016-03-31 5 views
1

Ich habe eine Rails 4 App. Ich muss die verschiedenen Cache-Schlüssel irgendwie unterscheiden, kenne aber die Namenskonventionen nicht.rails4 Caching Namenskonventionen

Erstes Beispiel:

Ich habe eine Aufgabe Modell mit index, completed_tasks und incoming_tasks Aktionen. A haben wegen der Seitennummerierung den gleichen Instanznamen (@tasks).

Im Moment sind die Cache-Keys wie folgt benannt. Meine Fragen: 1. Ist die Cache-Key-Struktur gut genug? 2. Ist es wichtig, in welcher Reihenfolge ich die Teile des Schlüssels in das Array einfüge? Zum Beispiel ist [@tasks.map(&:id), @tasks.map(&:updated_at).max, 'completed-tasks'] besser als ['completed-tasks', @tasks.map(&:id), @tasks.map(&:updated_at).max]?

completed_tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max, 'completed-tasks']) do %> 
    <%= render @tasks %> 
<% end %> 

tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max]) do %> 
    <%= render @tasks %> 
<% end %> 

incoming_tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max, 'incoming-tasks']) do %> 
    <%= render @tasks %> 
<% end %> 

Zweites Beispiel:

Ich habe auch Problem mit dem n aming Konventionen der russian-doll-caching:

products/index.html.erb 

<% cache([@products.map(&:id), @products.map(&:updated_at).max]) do %> 
    <%= render @products %> 
<% end %> 

_product.html.erb 

<% cache(product) do %> 
    <%= product.name %> 
    .... 
<% end %> 

Ist diese Version gut genug oder ich sollte immer eine Zeichenfolge in beide setzen die äußere und innere Cache Schlüssel Array Probleme mit ähnlich benannten Cache-Tasten auf anderen Seiten zu vermeiden. Zum Beispiel plane ich <% cache(@product) do %> auf der profile#show Seite, die genau die gleiche wie die innere Zwischenspeicherung in meinem Beispiel wäre. Wenn der Schlüssel anders sein muss, wie lautet die Konvention rails, um die inneren und äußeren Cache-Schlüssel zu benennen?

Antwort

1

Zuerst, nach russischen Doll Caching Artikel, ich denke, es ist nicht notwendig, die cache_key auf eigene Faust, Sie könnten es einfach zu Schienen, es erzeugt cache_key auto. Zum Beispiel sollte die cache_key von @tasks = Task.incoming unterscheiden sich von @tasks = Task.completed mit so etwas wie views/task/1-20160330214154/task/2-20160330214154/d5f56b3fdb0dbaf184cc7ff72208195e und views/task/3-20160330214154/task/4-20160330214154/84cc7ff72208195ed5f56b3fdb0dbaf1

cache [@tasks, 'incoming_tasks'] do 
    ... 
end 

Zweitens Wie für den Namespace, wenn die Vorlage verdauen die gleiche sein wird, aber die @tasks Digest wird anders sein. Es scheint also in diesem Fall ohne Namensraum in Ordnung zu sein.

Drittens, wenn es um Namespace geht, bevorzuge ich Präfix statt Suffix. d. h.

Als zweites Beispiel, ich denke, das würde gut tun.

<% cache @product do # first layer cache %> 
    <% cache @products do # second layer cache %> 
    <%= render @products %> 
    <% end %> 

    <% cache @product do # second layer cache %> 
    <%= product.name %> 
    .... 
    <% end %> 
<% end %> 

Der Caching-Schlüssel für app/views/products/show.html.erb wird so etwas wie views/Produkt/123-20160310191209/707c67b2d9fb66ab41d93cb120b61f46 sein. Das letzte Bit ist ein MD5 der Vorlagendatei selbst und all ihrer Abhängigkeiten.Es ändert sich, wenn Sie entweder die Vorlage oder eine der Abhängigkeiten ändern und so den Cache automatisch ablaufen lassen.

Weiterführende Literatur: https://github.com/rails/cache_digests

+0

abookyun wurde meine Frage etwas seltsam strukturiert. Können Sie mir sagen, ob sich ein Teil Ihrer Antwort auf mein zweites Beispiel bezieht (wo ich '@ product' absichtlich zum Unterschied vom ersten Beispiel verwende)? –

+0

@SzilardMagyar Ich aktualisierte die Antwort, siehe den letzten Teil davon. – abookyun

+0

abookyun, Ich habe den zweiten Teil meiner Frage aktualisiert, es war ein bisschen mehrdeutig, also hast du es falsch verstanden. –

1

Es ist die beste Vorgehensweise, immer eine Zeichenfolge am Ende zu setzen. Es muss wirklich nur etwas sein, das für dich Sinn macht.