ActiveRecord counter_cache дает устаревший счет с гемом multi_db - PullRequest
4 голосов
/ 11 октября 2009

Я использую gem multi-db с репликацией Slony-I на PostgreSQL в приложении Rails. Это в основном работает отлично, но в некоторых случаях наблюдается некоторая задержка репликации. Один из случаев связан с 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 (или записью ведомой базы данных, указывающей на master db), это работает нормально. Итак, я попробовал что-то вроде этого:

ActiveRecord::Base.connection_proxy.with_master do
  post=@comment.post
  count=post.comments_count
end

Это все еще дает устаревший результат. Как это делает установка:

config.cache_classes = false

Похоже, что звонок на with_master не работает. Любой совет, как определить, какую базу данных multi-db использует? Или, альтернативно, о том, как бороться с такими проблемами?

Ответы [ 2 ]

1 голос
/ 16 октября 2009

Не знаю, подходит ли вам это решение, но я использую мазохизм для своей репликации БД, а функциональность counter_cache работает просто отлично. так что, возможно, проблема в жемчужине, и вам нужно подать заявку.

0 голосов
/ 19 октября 2009

По моему опыту, чем дальше вы получаете от "основных" вариантов использования Rails или чем больше плагинов вы собираете, тем меньше вы можете рассчитывать на расширенную функциональность для совместной работы. Это особенно верно для магии ActiveRecord.

Если важно, чтобы количество комментариев оставалось актуальным, сделайте это явно. Избавьтесь от counter_cache и реализуйте обратные вызовы after_create и after_destroy в вашей модели комментариев, которые увеличивают и уменьшают поле счетчика в вашей модели Post. (Или, возможно, более надежно, установите для них пересчитанное количество для этой области.) Это выглядит менее плавно, но вряд ли выйдет из строя при любом разумном наборе зависимостей.

...