2010-05-06 18 views

Respuesta

91

Por lo que puedo recordar, has_and_belongs_to_many le da una tabla de búsqueda simple que hace referencia a sus dos modelos.

Por ejemplo,

historias pueden pertenecer a varias categorías. Las categorías pueden tener muchas historias.

Categories_Stories Table 
story_id | category_id 

has_many :through le da un tercer modelo que se puede utilizar para almacenar varias otras piezas de información que no pertenecen a ninguno de los modelos originales.

Por ejemplo

persona puede suscribirse a muchas revistas. Las revistas pueden tener muchos suscriptores.

Por lo tanto, podemos tener un modelo de suscripción en el medio, que nos da una tabla similar a la del ejemplo anterior, pero con propiedades adicionales.

Subscriptions Table 
person_id | magazine_id | subscription_type | subscription_length | subscription_date 

Y así sucesivamente.

+24

tenga en cuenta que la tabla debe nombrarse por orden alfabético, es decir, categories_stories table en lugar de stories_categories: esta es la convención que lo hace funcionar. – Will

+0

Gracias, he cambiado mi publicación ahora – Dan

+0

¿por qué deben ser alfabéticas @Will? – ctilley79

30

De http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

La regla más simple de oro es que se debe establecer un has_many: a través de la relación si es necesario trabajar con el modelo de relación como una entidad independiente. Si no necesita hacer nada con el modelo de relación, puede ser más sencillo configurar una relación has_and_belongs_to_many (aunque deberá recordar crear la tabla de unión en la base de datos). Debe usar has_many: through si necesita validaciones, devoluciones de llamada o atributos adicionales en el modelo de unión.

+3

También agregaría que hay muchos métodos de inserción de rails para has_and_belongs_to_many y no para has_many: a través de .Todos los métodos, como la asignación de una colección de valores a la asociación, no parecen mostrarse en la documentación de has_many: a través de http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference – e3matheus

13

Mi regla de oro es, ¿puedo arreglarme con una lista de casillas aquí? Si es así, entonces es una asociación habtm. Si necesito la casilla de verificación para capturar más acerca de la relación que simplemente si/no pertenece, entonces use has_many: through. HABTM es tan simple como usar el método _ids con simple_form collection_check_boxes. Has_mucho: a menudo implica accept_nested_attributes_for.

4

Debe usar has_many: through si necesita validaciones, devoluciones de llamada o atributos adicionales en el modelo de unión.

Cuestiones relacionadas