ActiveRecord counter_cache使用multi_db gem提供过时计数

时间:2009-10-10 20:03:50

标签: ruby-on-rails database-replication master-slave slony

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

2 个答案:

答案 0 :(得分:1)

不确定它是否是您所使用的解决方案,但我使用masochism进行数据库复制,counter_cache功能正常运行。所以问题可能在于宝石,你需要提交一张票。

答案 1 :(得分:0)

根据我的经验,您从“主流”Rails用例或堆叠的插件越远,您就越少依赖高级功能来协同工作。 ActiveRecord魔术尤其如此。

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