mongoid: uso de include para seleccionar objetos secundarios en una relación de referencia 1..N

Tengo un escenario como este:

blog.posts

donde cada publicación pertenece a otro objeto, digamos Etiqueta (en una relación pertenece_a, tiene_muchos), entonces puedo hacer:

tag.posts

Para evitar el problema de N+1, quiero poder hacer blog.posts, pero también tomar cada etiqueta asociada con cada publicación, de modo que se generen dos consultas, una para las publicaciones y otra para todas las etiquetas (basado en cada tag_id perteneciente a la publicación).

Noté en la documentación mongoide que puedo hacer:

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

que me dará todas las publicaciones que pertenecen a un blog, y también obtendrá cada etiqueta asociada con la publicación y colocará el mapa de identidad (siempre que esté habilitado).

El problema es que quiero hacer:

blog.posts

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

Por el momento estoy mitigando esto definiendo una extensión:

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

para que yo haga

blog.posts.with_tags

pero preferiría eso

blog.posts

hace lo anterior por defecto.

Saludos.

preguntado el 03 de mayo de 12 a las 18:05

1 Respuestas

Puede usar ámbitos para lograr esto, ámbitos predeterminados particulares. Entonces, en su modelo Post, puede definir su modelo de la siguiente manera:

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

De esa manera, cada vez que realice una consulta para obtener publicaciones, como Blog.posts, mongoid también generará una consulta para obtener todas las etiquetas asociadas con cada publicación.

contestado el 04 de mayo de 12 a las 17:05

¿Hay alguna otra manera de hacer esto? es decir, de un objeto mongoide? - K2xL

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.