Active counter_cache geben abgestanden Zählung mit multi_db gem
-
20-09-2019 - |
Frage
Ich bin mit dem Multi-db Juwel mit Slony-I-Replikation auf PostgreSQL in einer Rails-Anwendung. Das funktioniert meist perfekt, aber es ist ein bisschen von einer Replikationsverzögerung in bestimmten Fällen. Einer der Fälle beinhaltet eine Active counter_cache.
Aus Gründen der Klarheit übernehmen die beiden folgenden Modelle:
class Post < ActiveRecord::Base
has_many :comments
...
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true, :touch => true
...
end
Nach der Erstellung eines Kommentars, rjs zu aktualisieren Kommentare aufgerufen zählen mit:
@comment.post.comments_count
Mit dem Multi-db ausgeschaltet (oder der Eintrag für die Slave-Datenbank die der Master db zeigt), das funktioniert gut. Also habe ich versucht, so etwas wie folgt aus:
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
Das gibt noch ein schales Ergebnis. Wie funktioniert Einstellung:
config.cache_classes = false
Es sieht aus wie der Aufruf von with_master
funktioniert nicht. Alle Ratschläge, wie zu bestimmen, welche Datenbank Multi-db verwendet? Oder alternativ über den Umgang mit solchen Fragen beschäftigen?
Lösung
Nach meiner Erfahrung, die weiter weg Sie von „Mainstream“ Rails Fälle verwenden oder die weiteren Plugins, die Sie stapeln, desto weniger können Sie auf erweiterte Funktionen für alle Arbeiten zusammen zählen. Dies gilt insbesondere mit Active Magie.
Wenn es wichtig ist, dass Ihr Kommentar Zahl auf dem Laufenden bleiben, tun Sie es ausdrücklich. Befreien Sie sich von der counter_cache und implementieren after_create
und after_destroy
Rückrufen in Ihrem Kommentar Modell, dass zum Erhöhen und Verringern des Zählerfeldes in Ihrem Beitrag Modell. (Oder vielleicht zuverlässige, setzten sie auf die neu berechnete Zählung für diesen Bereich.) Es ist weniger glatt aussieht, aber es ist nicht wahrscheinlich unter jedem vernünftigen Satz von Abhängigkeiten zum Scheitern verurteilt.
Andere Tipps
Nicht sicher, ob es die Lösung, die Sie nach sind, aber ich benutze Masochismus für meine DB-Replikation und die counter_cache
Funktionalität funktioniert gut. so vielleicht das Problem in der Perle ist, und Sie müssen ein Ticket einzureichen.