ActiveRecord counter_cache dando conteggio stantio con la gemma multi_db
-
20-09-2019 - |
Domanda
Sono utilizzando la gemma multi-db con la replica Slony-I su PostgreSQL in un'applicazione Rails. Questo funziona per lo più perfettamente, ma c'è un po 'di un ritardo di replica in alcuni casi. Uno dei casi comporta un counter_cache ActiveRecord.
Per chiarezza, assumere i seguenti due modelli:
class Post < ActiveRecord::Base
has_many :comments
...
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true, :touch => true
...
end
Dopo la creazione di un commento, RJS è chiamato ad aggiornare i commenti contare con:
@comment.post.comments_count
Con il multi-db spento (o la voce per il database degli schiavi puntando il db master), questo funziona bene. Così, ho provato qualcosa di simile:
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
Questo dà comunque un risultato stantio. Così come l'impostazione:
config.cache_classes = false
Sembra che la chiamata a with_master
non funziona. Qualche consiglio su come determinare quale database multi-db sta usando? O, in alternativa, su come affrontare tali questioni?
Soluzione
Nella mia esperienza, il più lontano si ottiene da Rails "mainstream" casi d'uso o il più plugin Stack, meno si può contare su funzionalità avanzate per lavorare tutti insieme. Ciò è particolarmente vero con la magia ActiveRecord.
Se è importante che il valore del tuo commento rimanere aggiornati, farlo in modo esplicito. Sbarazzarsi del counter_cache e implementare after_create
e after_destroy
callback nel modello commento che di incremento e decremento del campo di conteggio nel modello Post. (O, forse più affidabile, impostarle al conte ricalcolato per tale ambito.) Sembra meno liscia, ma non rischia di fallire in qualsiasi serie ragionevole di dipendenze.
Altri suggerimenti
Non so se è la soluzione che cercate, ma io uso masochismo per la mia replica DB, e la funzionalità counter_cache
sta lavorando bene. quindi forse il problema è nel gioiello e avete bisogno di una richiesta di assistenza.