IIC2513-2018-2/syllabus

Problems with Form arranging Array [Proyecto] [Entrega3]

Closed this issue · 3 comments

Estimados,

A continuación presento 2 problemas que no hemos podido solucionar en la programación de nuestro proyecto:

Pregunta 1:
Algunos de nuestros modelos tienen como uno de sus atributos un arreglo (DataTypes.ARRAY(...)). El problema es que los form en HTML no agrupan los elementos en arreglos, sino que envían cada elemento del form como un valor independiente en la respuesta (aún cuando estos tenga el mismo nombre).

Finamente la duda que tenemos es: ¿cómo agrupar multiples elementos de un form de manera que estos se envíen como un arreglo?. Todas las soluciones que he encontrado presentan soluciones implementadas en php (ejemplo: agregar un [] al final de nombre del atributo) y por más que busco en javascript no logró entender bien las implementaciones que he encontrado.

->A continuación agrego una contextualización del problema, de forma de aclarar la pregunta:
Nuestro modelo "Recetas de cocina" puede tener multiples "Clasificaciones" (vegetariano, vegano, gluteen-free, ... ). Estas clasificaciones sólo son un string, por lo que no es conveniente tener un modelo aparte sólo para este atributo. Es por eso que nuestra idea es que cada "Receta de cocina" tenga su propia lista de Clasificaciones.

Pregunta2:
¿Como se manejan las relaciones "belongsToMany" (n:m) ? Esto orientado a saber como agregar esta relación cuando a nuestra DB. Para el manejo de estas relaciones (n:m) utilizamos una tabla externa que relaciones los ID de cada uno de los modelos relacionados (en nuestro caso, id_recetas y id_productos). ¿Es necesario agregar un modelo adicional que represente a esta tabla y a cual se le entregue la información? ¿O puede manejarse directamente desde los modelos que la tabla relaciona ?

-> Contexto:
Las "Recetas" de nuestro modelo tiene productos. Los productos pueden pertenecer a muchas recetas distintas.

Las asociaciones correspondientes se encuentran declarados en los modelos:
Recetas tiene la siguiente asociación:
recipe.belongsToMany(models.product, { through: 'recipeProducts' });

Productos lo tiene de la misma forma:
product.belongsToMany(models.recipe, { through: 'recipeProducts' });

Cualquier cosa que no quede claro, no duden en preguntar
Saludos!

Problema 1 solucionado! :D

@nicosoto0 no estoy seguro si entendí la pregunta exacta respecto a 2, pero lo que necesitas sí o sí, obviamente, es la tabla que relaciona las otras dos tablas, con foreign keys correspondientes. Teniendo eso, puedes especificar el nombre de esa tabla de relación con la opción through como lo estás haciendo, y luego sequelize debería poder manejar los datos de esa tabla por sí solo, suponiendo que usas los métodos que se agregarán a tus modelos por esa definición de relación (recipe.addProduct, por ejemplo).

Ojo que si no sigues los valores de convención para el nombre de la join table y las foreign keys, deberás especificar las foreign keys en la declaración de la relación belongsToMany (el through es obligatorio en cualquier caso).

Sólo necesitas crear un modelo para la join table si es que tienes otros datos además de las foreign keys que te gustaría poder controlar desde sequelize.

Respecto al problema 1, ¿cómo lo solucionaste?

Muchas gracias por su respuesta!

Para el problema se logra solucionar asignando el mismo nombre a varias de la entradas del form. Luego la respuesta que se enviará al servidor del submit del form tendrá varios elementos con el mismo nombre. Nuestros modelos tiene atributos del tipo: DataTypes.ARRAY(DataTypes.STRING). entonces junta todos los elementos recibidos en la lista del atributo.

Ej: Recetas tiene atributo:
{steps: DataTypes.ARRAY(DataTypes.Text)}
Luego en el form le asignamos el mismo: name = 'steps' a varias entradas y de esta forma todos se agregan al array.