2009-06-11 10 views
4

Comment lancer mon propre cache de compteur pour une relation plusieurs-à-plusieurs autoréférentielle qui utilise has_many :through?Rails: comment implémenter la mise en cache avec auto-référence Many to Many via has_many: through

J'ai besoin de suivre le nombre de citations et de références pour chaque article

J'utilise à peu près le code de la réponse à cette question:

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 

Répondre

4

Le mécanisme du cache de compteur Rails utilise le increment_counter et decrement_counter des méthodes internes. Vous devriez juste pouvoir appeler ces méthodes du standard ActiveRecord callbacks.

Quelque chose comme cela devrait vous donner l'idée:

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 

fin

+0

Merci John. C'était à peu près la moitié de ce que j'avais besoin de savoir, mais ça m'a permis de partir. J'ai en fait dû incrémenter et décrémenter à la fois le compte de l'article publication_id et le compte de l'article reference_id. – srboisvert

+0

Bon, je suis content que cela ait aidé. Je pensais que vous auriez à incrémenter les deux. –

3

Pour has_many: par AssociationAutomatic, suppression de jointure des modèles est direct, sans détruire les callbacks sont déclenchées. Donc le compteur de décrémentation ne fonctionnera pas dans ce cas

Questions connexes