Das Zwischenspeichern von paginierten Sammlungen ist knifflig. Der übliche Trick, die Sammlungszahl und max updated_at
zu verwenden, gilt meistens nicht!
Wie du gesagt hast, ist die Sammlungszahl eine gegebene Größe und daher irgendwie nutzlos, es sei denn, du erlaubst dynamische per_page
Werte.
Das neueste updated_at
ist vollständig abhängig von der Sortierung deiner Sammlung.
Stell dir vor, ein neuer Datensatz wird hinzugefügt und landet auf Seite eins. Das bedeutet, dass ein Datensatz, der zuvor auf Seite 1 war, jetzt auf Seite 2 erscheint. Ein zuvor auf Seite 2 befindlicher Datensatz wird jetzt zu Seite 3. Wenn der neue Datensatz auf Seite 2 nicht aktualisierter ist als der vorherige Maximalwert, bleibt der Zwischenspeicher-Schlüssel gleich, aber die Sammlung nicht! Das Gleiche passiert, wenn ein Datensatz gelöscht wird.
Nur wenn du garantieren kannst, dass neue Datensätze immer auf der letzten Seite landen und keine Datensätze gelöscht werden, ist die Verwendung des max updated_at
ein solider Ansatz.
Als Lösung könntest du die Gesamtanzahl der Datensätze und das Gesamtmaximal updated_at
im Zwischenspeicher-Schlüssel einschließen, zusätzlich zur Seitennummer und dem per_page
Wert. Dies erfordert zusätzliche Abfragen, kann sich aber je nach Datenbankkonfiguration und Datensatzanzahl lohnen.
Eine weitere Lösung besteht darin, einen Schlüssel zu verwenden, der eine reduzierte Form des tatsächlichen Inhalt der Sammlung berücksichtigt. Zum Beispiel unter Berücksichtigung aller Datensatz-IDs.
Wenn du postgres als Datenbank verwendest, könnte dir dieses Tool helfen, obwohl ich es selbst noch nie benutzt habe. https://github.com/cmer/scope_cache_key
Und der Rails 4 Fork: https://github.com/joshblour/scope_cache_key