2012-05-30 20 views
7

En los documentos se dice que usted puede utilizar inverse_of: cero, pero en realidad no se describe el caso de uso: http://mongoid.org/en/mongoid/docs/relations.html#has_and_belongs_to_many¿Cuáles son las ventajas y desventajas de la utilización de has_and_belongs_to_many MongoId con inverse_of

Estoy asumiendo que es útil en el caso donde un objeto tendría MUCHO del otro, entonces usted puede saltear ese lado completamente con inverse_of nil y ahorrar algo de espacio de almacenamiento ¿no?

Así, por ejemplo:

class Post 
    has_and_belongs_to_many :tags 
end 

class Tag 
    has_and_belongs_to_many :posts, inverse_of: nil 
end 

Una fuerza etiqueta pertenece a cientos o miles de mensajes, pero un post probablemente sólo tiene 5 o más etiquetas.

¿Es este un buen caso de uso para él? Asumo que todavía puede hacer

tag.posts 

etc como normal, y la principal solución de compromiso es que cambia la consulta de:

Post.find(tag.post_ids) 

en

Post.where(tag_ids: tag.id) 

Si usted tiene un índice en tag_ids parece que todavía sería bastante rápido. Así que tal vez lo mejor es algo así como:

class Post 
    has_and_belongs_to_many :tags, index: true 
end 

class Tag 
    has_and_belongs_to_many :posts, inverse_of: nil 
end 

Sólo quiero comprobar mi pensamiento.

Respuesta

7

Definitivamente tiene el caso de uso correcto, pero el ejemplo parece ser revisado. Sus modelos deben tener este aspecto:

class Post 
    has_and_belongs_to_many :tags, inverse_of: nil, index: true 
end 

class Tag 
    # you don't want this side as a tag can be related to 1000s of posts 
end 

Puede utilizar las asociaciones de mensajes pero para etiquetas que tendrá que crear consultas a sí mismo.

post.tags     # get tags for a post 
Post.where(tag_ids: tag.id) # find posts for a tag 
+0

Ok impresionante, esto tiene más sentido ahora lo que entiende por un solo lado - no lo hace la configuración HABTM en el otro lado. Gracias @rubish ¡Realmente lo aprecio! –

+0

Solo para hacer un seguimiento ... ¿sabes si hay una manera fácil de configurar los métodos de acceso en el lado 'Tag '. Empecé a definir mi propia 'def postes',' def posts = 'etc. pero me di cuenta de que hay bastantes más como' << ',' push', y las devoluciones de llamada posteriores cuando una publicación se destruye, etc. Imaginé que podría haber una manera más fácil. ¡Gracias! –

+0

@BrianArmstrong Lo siento, pero no conozco una salida fácil. Aunque puedes probar la lista de correo de mongoid. – rubish

Cuestiones relacionadas