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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top