ActiveRecord counter_cache 주는 부실 계산 multi_db 석
-
20-09-2019 - |
문제
나를 사용하여 db 에 보석으로 Slony-내에서 복제 PostgreSQL 에서 레일 앱입니다.이 대부분이 완벽하게 작동하지만,거기에 약간의 복제를 지연하는 경우도 있습니다.하나의 경우에 포함 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
Multi-db off(또는 항목에 대해 슬레이브 데이터베이스를 가리키는 마스터 db)이 잘 작동합니다.그래서 저는 무언가 이것을 좋아한다:
ActiveRecord::Base.connection_proxy.with_master do
post=@comment.post
count=post.comments_count
end
이 여전히 오래된 결과입니다.으로 설정:
config.cache_classes = false
그것처럼 보이는 전화 with_master
작동하지 않습니다.는 방법에 대한 조언을 결정하는 데이터베이스 멀티-db 를 사용하지 마십시오.거나,또는에 처리하는 방법으로 이러한 문제를 해결합니까?
해결책
내 경험에 더 멀리에서 얻는"주류"레일을 사용하여 케이스 또는 더 플러그인 스택,적은 믿을 수 있는 고급 기능을 모두 함께 작동합니다.이와 함께 특히 사실 ActiveRecord 마법입니다.
는 경우 그것은 중요하신 의견을 최신 상태로 유지,그것을 명시적으로 합니다.의 제거 counter_cache 및 구현 after_create
고 after_destroy
콜백에서 당신의 코멘트는 모델의 증가 또는 감소시킬수 필드에서 당신의 게시물 모델입니다.(또는,아마도 더 많은 신뢰할 수 있고,그들을 설정하여 계산 수 있는 범위가 있습니다.) 그것은 모양이 매끄러운 하지만 그렇지 않은 실패할 가능성이 아래에서 모든 합리적인 설정의 종속성입니다.
다른 팁
가 확실하지 않는 경우는 그것의 솔루션을 제공하고 있습니다 그러나 내가 사용하는 습니까? 내 DB 복제,고 counter_cache
기능이 작동됩니다.그래서 아마도 이 문제에 보석이 필요하신 티켓에.