ActiveRecordのはmulti_db宝石で古くなった回数を与えるcounter_cache
-
20-09-2019 - |
質問
私はRailsのアプリでPostgreSQLの上のSlony-IレプリケーションとマルチDBの宝石を使用しています。これは、ほとんど完璧に動作しますが、特定の場合には、複製の遅れのビットがあります。例の一つは、のActiveRecord counter_cacheを伴うます。
明確にするためには、次の2つのモデルを想定します:
class Post < ActiveRecord::Base
has_many :comments
...
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true, :touch => true
...
end
コメントの作成後、RJSはコメントでカウント更新するために呼び出されます:
@comment.post.comments_count
マルチDBがオフ(またはスレーブデータベースのエントリは、マスタDBを指す)で、これは正常に動作します。だから、私はこのような何かを試してみました。
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
これはまだ古い結果を与えます。設定しない:
config.cache_classes = false
with_master
への呼び出しが動作しないように、に見えます。マルチDBが使用しているデータベースを判別する方法上の任意のアドバイスはありますか?あるいは、そのような問題に対処する方法について?
解決
私の経験では、遠く離れたあなたはケースや、あなたがスタックより多くのプラグインを使用し、より少ないあなたが一緒にすべての作業に高度な機能を頼りにすることができ、「主流」のRailsから取得します。これは、ActiveRecordのマジックと特に当てはまるます。
それはあなたのコメント数は日まで滞在することが重要だ場合は、明示的にそれを行います。 counter_cacheを取り除くとインクリメントして、Postモデルにカウント・フィールドをデクリメントあなたのコメントモデルでafter_create
とafter_destroy
コールバックを実装します。 (または、おそらくより信頼性の高い、そのスコープの再計算回数に設定します。)これはあまりツルツルに見えるが、依存関係のいずれかの合理的なセットの下で失敗する可能性はありません。
他のヒント
わかりません/ A>私のDBの複製のために、とcounter_cache
の機能がうまく働いています。ので、おそらく問題は宝石であり、あなたがチケットを提出する必要があります。