2012-05-03 13 views
5

Tengo un escenario como este:MongoId - utilizando incluye a seleccionar a los niños objetos en una relación 1..N referencia

blog.posts 

donde cada puesto pertenece a otro objeto, dicen Tag (en un belongs_to, relación has_many), de modo que pueda hacer:

tag.posts 

para evitar el problema N + 1, quiero ser capaz de hacer blog.posts, pero también agarro cada etiqueta asociada con cada mensaje, de modo que se generan dos consultas, uno para las publicaciones, y una para todas las etiquetas (en función de cada tag_id que pertenece a la publicación).

me di cuenta en la documentación MongoId que puedo hacer:

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

que conseguirme todos los mensajes que pertenecen a un blog, y también conseguir cada etiqueta asociada con el puesto y poner en el mapa de identidad (siempre y cuando se habilitado).

El problema es que quiero hacer:

blog.posts 

y de alguna manera redefinir la consulta para hacer lo que quiero anteriormente. ¿Hay una manera de hacer eso?

En este momento estoy mitigar esto definiendo una extensión:

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

por lo que hago

blog.posts.with_tags 

pero preferiría que

blog.posts 

hace lo anterior por defecto.

Saludos.

Respuesta

7

Puede usar ámbitos para lograr esto, determinados ámbitos predeterminados. Así que en su modelo Post, puede definir su modelo de este tipo:

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

De esa manera cada vez que se hace una consulta para obtener los mensajes, como Blog.posts, MongoId también generará una consulta para obtener todas las etiquetas asociadas a cada uno enviar.

+0

¿hay alguna otra manera de hacer esto? es decir, de un objeto mongoide? – K2xL

Cuestiones relacionadas