through references rails many has_one has_many has_and_belongs_to_many has example create belongs and ruby-on-rails has-and-belongs-to-many

ruby-on-rails - references - rails has_one through



has_and_belongs_to_many en Rails (4)

¿Hay algún error explícito con el uso de las asociaciones has_and_belongs_to_many en rieles en lugar de has_many: a través? Soy consciente de these articles describing diferencias y los métodos de trabajo, pero son de 2006. De las cosas que he leído en SO, parece que la gente piensa que habtm es viejo y torpe, pero ¿qué pasa si muchos de muchos se unen? ¿No necesitas modelo es lo que estás buscando?

¿Pensamientos?


Lo pienso de esta manera. Suponiendo que ya descubrió que necesita un modelo de muchos a muchos:

X----1 __/ / Y----2 __/ / Z----3

(x-> 1 y-> 1,2 z-> 2,3)

Use una relación HABTM si NO necesita almacenar información sobre cada una de las líneas en mi imagen (con suerte, reconocible) arriba.

Si necesita almacenar información sobre esas líneas (relaciones), utilice un "a través de".

Entonces, si solo está diciendo que las personas [XYZ] tienen y pertenecen a proyectos [123] pero no necesitan decir nada sobre la persona X en el proyecto 1, use un HABTM.

Si quiere decir que la persona X tiene el proyecto 1 y se le asignó ese proyecto en una fecha determinada , de repente tiene una relación adecuada para esa relación en particular y utiliza mejor el HMT.


No hay nada de malo en usar has_and_belongs_to_many si no necesita un modelo de unión. Acabo de usarlo en un proyecto reciente.


Nunca usaría HABTM, no porque me preocupe la elegancia, sino porque siempre puedo imaginar querer agregar datos a una relación en el futuro, incluso si no puedo ver el punto ahora. Siendo perezoso, me gustaría poder simplemente agregar las columnas a la unión en lugar de tener que volver a trabajar las relaciones y luego agregar las columnas.


has_and_belongs_to_many está diseñado para relaciones simples de muchos a muchos.

has_many: a través, por otra parte, está destinado a relaciones de uno a muchos indirectas, o relaciones de muchos a muchos con propiedades.

Si solo está buscando una relación simple de muchos a muchos, no veo ninguna razón para no usar has_and_belongs_to_many.

Ejemplo de relación muchos a muchos:

El usuario pertenece a cero o más grupos, y el grupo tiene cero o más miembros (usuarios).

Ejemplo de relación de muchos a muchos con propiedades:

El usuario pertenece a cero o más grupos, y el grupo tiene cero o más miembros con rangos.

Por ejemplo, Alice podría ser una Administradora en el Grupo A y una Moderadora en el Grupo B. Puede mantener esta propiedad en la tabla de unión.

Ejemplo de relación indirecta uno a muchos:

Una categoría tiene cero o más subcategorías, y cada subcategoría tiene cero o más elementos.

Por lo tanto, una categoría tiene cero o más artículos a través de sus subcategorías.

Considera estas categorías:

Comida → Frutas, Vegetales
Frutas → Manzana, Naranja, etc.
Verduras → Zanahoria, Apio, etc.

por lo tanto:

Comida → Manzana, Naranja, Zanahoria, Apio, etc.