ActiveRecord counter_cache dando cuenta de rancio con la gema multi_db
-
20-09-2019 - |
Pregunta
Estoy usando la gema multi-db con la replicación SlonyI en PostgreSQL en una aplicación Rails. Esto sobre todo funciona perfectamente, pero hay un poco de un retraso de replicación en ciertos casos. Uno de los casos implica un counter_cache ActiveRecord.
Para mayor claridad, asumen los dos modelos siguientes:
class Post < ActiveRecord::Base
has_many :comments
...
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true, :touch => true
...
end
Después de la creación de un comentario, rjs se llama a actualizar los comentarios contar con:
@comment.post.comments_count
Con multi-db apagado (o la entrada de la base de datos de esclavos que apunta el PP el maestro), esto funciona bien. Por lo tanto, he intentado algo como esto:
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
Esto todavía da un resultado rancio. Al igual que el establecimiento de:
config.cache_classes = false
Parece que la llamada a with_master
no está funcionando. Cualquier consejo sobre cómo determinar qué base de datos multi-db está utilizando? O, alternativamente, sobre la manera de abordar estas cuestiones?
Solución
En mi experiencia, cuanto más lejos que se obtiene de los carriles "principales" casos de uso o los complementos que más pila, menos se puede contar con funcionalidad avanzada para trabajar todos juntos. Esto es particularmente cierto con la magia ActiveRecord.
Si es importante que su comentario recuento de estar al día, hacerlo de forma explícita. Deshacerse de la counter_cache e implementar devoluciones de llamada after_create
y after_destroy
en su modelo de comentario que incremento y decremento del campo de cuenta en su modelo Post. (O, tal vez más fiable, poned para el recuento recalculado para que alcance.) Se ve menos resbaladizo, pero no es probable que falle bajo cualquier conjunto razonable de las dependencias.
Otros consejos
No está seguro de si es la solución que está después, pero yo uso masoquismo para mi replicación de base de datos, y la funcionalidad counter_cache
está trabajando muy bien. así que quizás el problema está en la gema y tiene que presentar un ticket.