IIC2513-2021-2 / project

Repositorio oficial para el proyecto del curso IIC2513, período 2021-2
32 stars 1 forks source link

Generador - Consistencia del código del modelo #28

Open benjavicente opened 2 years ago

benjavicente commented 2 years ago

Empecé a hacer un nuevo modelo y me di cuenta de que la manera que se estaba generando era distinta a la que tenía para el resto de los modelos, era completamente funcional (de usar funciones). Mirando el generador, eso es lo esperado:

module.exports = (sequelize, DataTypes) => {
  const <%= name %> = sequelize.define('<%= name %>', {
    <%_ attributes.forEach((attribute, index) => { _%>
    <%= attribute.fieldName %>: DataTypes.<%= attribute.dataType.toUpperCase() %>,
    <%_ }) _%>
  }, {});
  <%= name %>.associate = function associate() {
  };
  return <%= name %>;
};

Y lo que tenemos y lo que está en soundify utiliza clases:

'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class album extends Model {
    static associate(models) {
      this.belongsTo(models.artist);
    }
  };
  album.init({
    artistId: DataTypes.INTEGER,
    name: DataTypes.STRING,
    publishedAt: DataTypes.DATEONLY,
    cover: DataTypes.STRING,
  }, {
    sequelize,
    modelName: 'album',
  });
  return album;
};

¿Hay una forma de crear modelos que tengamos o recomiendan que seguir? (se que hacen lo mismo), ¿y de dónde sale / se generan los modelos con clases? Gracias de antemano 😅

Edit: aprovechó de preguntar / comentar otra cosa: ¿no sería como bueno seguir el mismo estilo de las clases para los modelos? En todas las partes que he visto del proyecto no se utiliza CamelCase y en la documentación de sequelize se utiliza ese formato.

LeoMo-27 commented 2 years ago

Holaa! Nosotros usamos Sequelize CLI para crear los modelos, esto tambien se toca en la ayudantia 3, parece que tu usaste el generador de modelos que viene en el template pero ya no es necesario su uso debido a la existencia del CLI de Sequelize. Para tu ultima consulta, en que parte del proyecto no se utiliza camelCase? Hasta donde se siempre se usa o al menos se recomienda para seguir el mismo estilo.

benjavicente commented 2 years ago

Me refería a UpperCamelCase en las clases, por ejemplo, en el caso de los álbumes con UpperCamelCase debería cambiar

  const { Model } = require('sequelize');
  module.exports = (sequelize, DataTypes) => {
-   class album extends Model {
+   class Album extends Model {
      static associate(models) {
-       this.belongsTo(models.artist);
+       this.belongsTo(models.Artist);
      }
    };
-   album.init({
+   Album.init({
      artistId: DataTypes.INTEGER,
      name: DataTypes.STRING,
      publishedAt: DataTypes.DATEONLY,
      cover: DataTypes.STRING,
    }, {
      sequelize,
-     modelName: 'album',
+     modelName: 'Album',
    });
-   return album;
+   return Album;
  };
meretamal commented 2 years ago

Hola 😁. Estás en toda libertad de usar PascalCase para los modelos, si es que así lo prefieres. En lo personal prefiero camelCase, ya que tu tabla asociada, por defecto, va a llevar el mismo nombre que el modelo y se me hace más cómodo hacer consultas a table que a "Table" al momento de debuggear.

sivicencio commented 2 years ago

Hola @benjavicente. Respecto a tu pregunta inicial, recomendamos que utilicen modelos con clases ya que, como han comentado, es lo que sequelize-cli genera actualmente, y se aprovechan mejor las features de ES6. Por esa misma razón, es recomendable que creen sus modelos con:

yarn sequelize model:generate
yarn sequelize model:create # Equivalente al anterior

El generador del template está desactualizado. Gracias por comentarlo de hecho para tenerlo en consideración en el próximo update que le haremos.