我正在使用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
的调用无效。有关如何确定多数据库使用的数据库的任何建议?或者,或者,如何处理这些问题?
答案 0 :(得分:1)
不确定它是否是您所使用的解决方案,但我使用masochism进行数据库复制,counter_cache
功能正常运行。所以问题可能在于宝石,你需要提交一张票。
答案 1 :(得分:0)
根据我的经验,您从“主流”Rails用例或堆叠的插件越远,您就越少依赖高级功能来协同工作。 ActiveRecord魔术尤其如此。
如果您的评论计数保持最新非常重要,请明确执行此操作。摆脱counter_cache并在Comment模型中实现after_create
和after_destroy
回调,以增加和减少Post模型中的count字段。 (或者,也许更可靠,将它们设置为该范围的重新计算的数量。)它看起来不那么光滑,但它不可能在任何合理的依赖性集合下失败。