Rails: как реализовать кэширование счетчиков с помощью самореферентных «многие ко многим» через has_many: through - PullRequest
4 голосов
/ 11 июня 2009

Как я могу развернуть свой собственный кеш счетчика для само-ссылочного отношения многие-ко-многим, использующего has_many :through?

Мне нужно отслеживать количество ссылок и ссылок для каждой статьи

Я примерно использую код из ответа на этот вопрос :

class Publication < ActiveRecord::Base
  has_many :citations
  has_many :cited_publications, :through => :citations, :source => :reference
  has_many :references, :foreign_key => "reference_id", :class_name => "Citation"
  has_many :refered_publications, :through => :references, :source => :publication
end

class Citation < ActiveRecord::Base
  belongs_to :publication
  belongs_to :reference, :class_name => "Publication"
end

Ответы [ 2 ]

4 голосов
/ 11 июня 2009

Механизм кэширования счетчика Rails использует методы increment_counter и decment_counter Вы должны просто иметь возможность вызывать эти методы из стандартных обратных вызовов ActiveRecord .

Что-то вроде этого должно дать вам идею:

class Citation < ActiveRecord::Base
  belongs_to :publication
  belongs_to :reference, :class_name => "Publication"

  after_create  :increment_counter_cache
  after_destroy :decrement_counter_cache

  private
  def decrement_counter_cache
    Publication.decrement_counter("citations_counter", publication_id)
  end

  def increment_counter_cache
    Publication.increment_counter("citations_counter", publication_id)
  end

конец

3 голосов
/ 24 июня 2011

Для has_many: с помощью AssociationAutomatic удаление моделей соединения происходит напрямую, обратные вызовы уничтожения не запускаются. Таким образом, счетчик декремента не будет работать в этом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...