我使用具有在一个Rails应用程序上的PostgreSQL Slony聚-1复制的多分贝宝石。这主要作品完美,但有一点在某些情况下复制滞后。一个的情况下涉及一个ActiveRecord counter_cache。

为了清楚起见,假设以下两种模式:

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

使用多分贝关断(或用于指向所述主分贝从属数据库条目),此工作正常。所以,我想是这样的:

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

这仍然给出了一个过时的结果。一样设定:

config.cache_classes = false

它看起来像调用with_master不工作。在任何意见如何确定多分贝正在使用的数据库?或者,就如何处理这些问题?

有帮助吗?

解决方案

在我的经验,进一步远离你从“主流”的Rails让用例或多个插件你一叠,越少,你可以在高级功能指望大家共同努力。这是特别真实用ActiveRecord魔法。

如果你对此有何评论数保持最新,这样做的明确是很重要的。摆脱counter_cache和实现您的评论模型after_createafter_destroy回调递增的,并在后期模型递减计数字段。 (或者,也许更可靠,他们设置为该范围重新计算的计数)。这看起来不太光滑,但也不太可能在任何合理的相关性集合的失败。

scroll top