4

我在 Rails 应用程序中的 PostgreSQL 上使用多数据库 gem 和 Slony-I 复制。这大部分工作得很好,但在某些情况下会有一点复制滞后。其中一种情况涉及 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不起作用。关于如何确定使用哪个数据库多数据库的任何建议?或者,或者,关于如何处理这些问题?

4

2 回答 2

1

不确定这是否是您所追求的解决方案,但我使用受虐狂进行数据库复制,并且该counter_cache功能运行良好。所以也许问题出在 gem 中,你需要提交一张票。

于 2009-10-16T06:00:08.930 回答
0

根据我的经验,您离“主流” Rails 用例越远,或者您堆叠的插件越多,您就越不能依靠高级功能来协同工作。对于 ActiveRecord 魔法尤其如此。

如果您的评论数量保持最新很重要,请明确执行。摆脱 counter_cache 并在 Comment 模型中实现after_createafter_destroy回调,以增加和减少 Post 模型中的 count 字段。(或者,也许更可靠,将它们设置为该范围的重新计算计数。)它看起来不那么光滑,但在任何合理的依赖项下它不太可能失败。

于 2009-10-19T15:23:05.557 回答