2010-03-19 7 views
6

J'essaye d'obtenir la fonction de cache de compteur de rails mais pas capable de le saisir complètement.Rails Counter Cache et sa mise en œuvre

Disons que nous avons 3 modèles

A B C

A appartient à B ou C en fonction d'un key_type de terrain et key_id. key_type indique si A appartient à B ou C, donc si key_type = « B », puis le dossier appartient à B sinon il appartient à C.

Dans mon modèle a.rb, j'ai défini les associations suivantes:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id" 
belongs_to :c, :counter_cache => true, :foreign_key => "key_id" 

et

dans les fichiers de modèle B et C

has_many :as , :conditions => {:key_type => "B"} 
has_many :as , :conditions => {:key_type => "C"} 

les deux modèles B et C ont une colonne comme as_count

Le problème est chaque fois qu'un objet d'un nombre créé est augmenté dans les deux modèles b et c.

Toute aide est appréciée. Au départ, je pensais que cela pourrait fonctionner:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "B"} 
belongs_to :c, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "C"} 

Mais cela n'aide pas.

Merci

+0

Ceci ne doit pas être étiqueté avec "Grails". – Fletch

Répondre

15

Il ressemble à des associations polymorphiques sont la voie à suivre pour votre question. Imaginez que vous ayez un modèle Comment et 2 modèles qui peuvent être commentés: Message et Profil.

Dans les modèles et post Profil:

has_many :comments, :as => :resource 

Dans le modèle de Commentaire:

belongs_to :resource, :polymorphic => true, :counter_cache => true 

Ne pas oublier d'ajouter la colonne "comments_count" à la fois le profil et les modèles post et le tour est joué!

+0

Cela fonctionne uniquement lors de l'ajout de commentaires. Le nombre de commentaires augmente, mais lorsqu'un commentaire est supprimé, il ne met pas à jour le fichier comments_count. une idée de pourquoi cela pourrait se produire? une solution possible? Je vous remercie. –

+0

ressemble à un bogue avec counter_cache et des relations polymorphes dans les rails <5.0. Voir https://github.com/rails/rails/issues/16407 – John