4

Rails アプリの PostgreSQL で Slony-I レプリケーションを使用して multi-db gem を使用しています。これはほとんど完全に機能しますが、場合によってはレプリケーションの遅延が少し発生します。ケースの 1 つは、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

multi-db をオフ (またはマスター データベースを指すスレーブ データベースのエントリ) にすると、これは正常に機能します。だから、私はこのようなことを試しました:

ActiveRecord::Base.connection_proxy.with_master do
  post=@comment.post
  count=post.comments_count
end

これはまだ古い結果をもたらします。設定と同様に:

config.cache_classes = false

への呼び出しが機能しwith_masterていないようです。multi-db が使用しているデータベースを特定する方法について何かアドバイスはありますか? または、代わりに、そのような問題に対処する方法について?

4

2 に答える 2

1

それがあなたの求めている解決策かどうかはわかりませんが、私は DB レプリケーションにマゾヒズムcounter_cacheを使用しており、機能は問題なく動作しています。おそらく問題は gem にあり、チケットを提出する必要があります。

于 2009-10-16T06:00:08.930 に答える
0

私の経験では、Rails の「主流」のユース ケースから遠ざかるほど、またはスタックするプラグインが増えるほど、すべてが連携して機能する高度な機能を期待できなくなります。これは特に ActiveRecord マジックに当てはまります。

コメント数を最新の状態に保つことが重要な場合は、明示的に行ってください。Post モデルのカウント フィールドをインクリメントおよびデクリメントする Comment モデルの counter_cache と実装after_createおよびコールバックを取り除きます。after_destroy(または、おそらくより信頼性の高い、そのスコープの再計算されたカウントに設定します。) 見た目はそれほど滑らかではありませんが、合理的な依存関係のセットの下で失敗する可能性は低いです。

于 2009-10-19T15:23:05.557 に答える