2012-05-03 10 views
5

Ho uno scenario come questo:mongoid - utilizzando include per selezionare i bambini oggetti in un rapporto 1..N riferimento

blog.posts 

dove ogni post appartiene ad un altro oggetto, dicono Tag (in un belongs_to, rapporto has_many), così posso fare:

tag.posts 

per evitare il problema N + 1, voglio essere in grado di fare blog.posts, ma anche afferrare ogni tag associato ad ogni post, in modo che due query sono generate, uno per i post e uno per tutti i tag (basato su ogni tag_id che appartiene al post).

ho notato nella documentazione mongoid posso fare:

Post.includes(:tag).where(:blog_id: blog.id) 

che mi avranno tutti i messaggi appartenenti a un blog, e anche ottenendo ogni tag associato alla posta e mettere nella mappa di identità (a condizione che sia abilitato).

Il problema è che io voglio fare:

blog.posts 

e in qualche modo ridefinire la query per fare quello che voglio sopra. C'è un modo per farlo?

Al momento sto mitigare questo definendo un prolungamento:

has_many :posts do 
    def with_tags 
    includes(:tag) 
    end 
end 

in modo che faccio

blog.posts.with_tags 

ma io preferirei che

blog.posts 

fa quanto sopra per impostazione predefinita.

Cheers.

risposta

7

È possibile utilizzare gli ambiti per ottenere questo, particolari ambiti predefiniti. Quindi nel tuo modello Post, è possibile definire il modello così:

class Post 
    belongs_to :tag 
    default_scope includes(:tag) 
end 

In questo modo ogni volta che si esegue una query per ottenere i messaggi, come Blog.posts, mongoid genererà anche una query per ottenere tutti i tag associati ad ogni inviare.

+0

c'è un altro modo per farlo? cioè da un oggetto mongoidico? – K2xL

Problemi correlati