質問

私は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_createafter_destroyコールバックを実装します。 (または、おそらくより信頼性の高い、そのスコープの再計算回数に設定します。)これはあまりツルツルに見えるが、依存関係のいずれかの合理的なセットの下で失敗する可能性はありません。

scroll top