2010-12-08 47 views
4

Rails 3.0.1 MongoId (2.0.0.beta.20)MongoId: rappel d'exécution du document incorporé sur parent

classe post embeds_many: commentaires terrain: comments_count fin

Class Comment 
embedded_in :commentable, :inverse_of => :comments 
end 

Je veux sélectionner les 10 messages les plus commentés. Pour ce faire j'ai besoin du champ comments_count dans Post. Mais comme mon commentaire est polymorphe (Post.comments, Message.comments, etc.), je ne veux pas créer de callback inc dans Post. Ce que je ne veux pas faire est de créer un callback dans Comment qui mettra à jour le champ comment_count dans Post.

Je ne sais pas comment je peux effectuer une opération inc dans le document embarqué sur le terrain du document Parrent et exécuter ce rappel du document Parrent

Répondre

6

Voici comment augmenter le Post du Comment polymorphes embarqué:

Class Comment 
    after_create :update_post_comment_count 

    def update_post_comment_count 
    if self._parent.class == Post 
     Post.collection.update({'_id' => self._parent._id}, 
           {'$inc' => {'comment_count' => 1}}) 
    end 
    end 
end 

Je suis assez sûr que ce rappel s'exécutera à chaque fois qu'un nouveau commentaire est créé, donc je ne pense pas que vous ayez à vous soucier de l'exécuter depuis le document parent. Laissez-moi savoir si cela fonctionne.

Voir this SO answer et ce Github issue pour plus d'informations sur les rappels dans les documents incorporés.

+0

Merci pour le code qui fonctionne pour moi:]. Avez-vous un lien vers la documentation de mongodb avec la description des méthodes _parent? – Lewy

+0

Je n'arrive pas à trouver de documentation pour '_parent'. Je l'ai trouvé moi-même par essais et erreurs. – bowsersenior