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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top