2010-12-08 2 views
4

Rails 3.0.1 Mongoid (2.0.0.beta.20)Mongoid: Запуск обратного вызова из встроенного документа на родителя

Класс Сообщение embeds_many: комментарии поле: comments_count конец

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

Я хочу выбрать 10 наиболее прокомментированных сообщений. Для этого мне нужно поле comment_count в Post. Но так как мой комментарий является полиморфным (Post.comments, Message.comments и т. Д.), Я не хочу создавать обратные вызовы в Post. То, что я не буду делать, это создать обратный вызов в комментарии, который будет обновлять поле comment_count в Post.

Я не знаю, как я могу выполнить операцию вкл во встроенном документе на поле из parrent документа и выполнить эту функцию обратного вызова из parrent документа

ответ

6

Вот как приращение Post от встроенного полиморфного Comment:

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 

Я уверен, что этот обратный вызов будет выполняться всякий раз, когда создается новый комментарий, поэтому я не думаю, что вам нужно беспокоиться о его выполнении из родительского документа. Дайте мне знать, если это сработает.

См. this SO answer и этот Github issue для получения дополнительной информации о обратных вызовах во встроенных документах.

+0

Спасибо, что код работает для меня:]. У вас есть ссылка на документацию mongodb с описанием методов _parent? – Lewy 2010-12-09 07:54:16

Смежные вопросы