ActiveRecord的counter_cache给人以multi_db宝石陈旧计数
-
20-09-2019 - |
题
我使用具有在一个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_create
和after_destroy
回调递增的,并在后期模型递减计数字段。 (或者,也许更可靠,他们设置为该范围重新计算的计数)。这看起来不太光滑,但也不太可能在任何合理的相关性集合的失败。
其他提示
不知道这是否是你所追求的解决方案,但我使用受虐狂一>我的DB复制和counter_cache
功能工作得很好。所以也许问题是创业板,你需要提交通知单。
不隶属于 StackOverflow