Сохранение записи Sequelize / Ссылка на нее в другой модели - PullRequest
0 голосов
/ 29 января 2020

У меня есть модель postrgresql / Sequelize под названием Segment, которая принадлежит многим моделям:

module.exports = (sequelize, DataTypes) => {
  const Segment = sequelize.define(
    'segment',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      provider_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'provider',
          key: 'id'
        }
      },
      summary_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'summary',
          key: 'id'
        }
      },
      audience_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'audience',
          key: 'id'
        }
      },
      onboarding_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'onboarding',
          key: 'id'
        }
      }
    },
    {
      // disable the modification of table names; By default, sequelize will automatically
      // transform all passed model names (first parameter of define) into plural.
      // if you don't want that, set the following
      freezeTableName: true,
      tableName: 'segment'
    }
  );
  Segment.associate = models => {
    Segment.belongsTo(models.Provider, { foreignKey: 'id' });
    Segment.belongsTo(models.Summary, { foreignKey: 'id' });
    Segment.belongsTo(models.Audience, { foreignKey: 'id' });
    Segment.belongsTo(models.Onboarding, { foreignKey: 'id' });
  };
  return Segment;
};

Модели, к которым относится этот сегмент (ie provider_id, summary_id, audience_id, onboarding_id) выглядит так:

Поставщик:

module.exports = (sequelize, DataTypes) => {
  const Provider = sequelize.define(
    'provider',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      providerName: {
        type: DataTypes.STRING
      },
      email: {
        type: DataTypes.STRING
      },
      privacyPolicy: {
        type: DataTypes.STRING
      }
    },
    {
      freezeTableName: true,
      tableName: 'provider'
    }
  );

  Provider.associate = models => {
    Provider.hasMany(models.Segment, { foreignKey: 'provider_id' });
  };

  return Provider;
};

Резюме:

module.exports = (sequelize, DataTypes) => {
  const Summary = sequelize.define(
    'summary',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      summaryName: DataTypes.STRING,
      standardIdName: DataTypes.STRING,
      description: DataTypes.STRING,
    },
    {
      freezeTableName: true,
      tableName: 'summary'
    }
  );

  Summary.associate = models => {
    Summary.hasMany(models.Segment, { foreignKey: 'summary_id' });
  };

  return Summary;
};

Аудитория:

module.exports = (sequelize, DataTypes) => {
  const Audience = sequelize.define(
    'audience',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      refreshCadence: DataTypes.STRING,
      sourceLookbackWindow: DataTypes.STRING
    },
    {
      freezeTableName: true,
      tableName: 'audience'
    }
  );

  Audience.associate = models => {
    Audience.hasMany(models.Segment, { foreignKey: 'audience_id' });
  };

  return Audience;
};

Включено:

module.exports = (sequelize, DataTypes) => {
  const Onboarding = sequelize.define(
    'onboarding',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      onboardingExpansions: DataTypes.STRING,
      onboardingAudiencePrecision: DataTypes.STRING
    },
    {
      freezeTableName: true,
      tableName: 'onboarding'
    }
  );

  Onboarding.associate = models => {
    Onboarding.hasMany(models.Segment, { foreignKey: 'onboarding_id' });
  };

  return Onboarding;
};

Мой вопрос: что должно быть первым при создании и сохранении записи сегмента? Должен ли я сначала создавать и сохранять каждую из других моделей (провайдер, сводка, аудитория, входящие в систему), а затем создавать / сохранять сегмент со ссылками на эти идентификаторы? Я действительно не знаю, каким должен быть порядок событий в этой ситуации. Любая помощь высоко ценится! Спасибо!

1 Ответ

0 голосов
/ 30 января 2020
  • TLDR:

Чтобы создать экземпляр Segment, вы должны иметь все 4 записи внешних ключей со ссылками на существующие записи в ссылочных таблицах (provider, summary , audience и onboarding).

  • Объяснение:

provider, summary, audience и onboarding таблицы независимы.

Однако модель Segment является не независимой. * Модель 1025 * Segment имеет 4 столбца, которые являются внешними ключами.

С PostgresSql Учебное пособие:

Внешний ключ - это поле или группа полей в таблице, которые уникальным образом идентифицируют строку в другой таблице. Другими словами, внешний ключ определен в таблице, которая ссылается на первичный ключ другой таблицы.

Таблица, которая содержит внешний ключ, называется ссылочной таблицей или дочерней таблицей. А таблица, на которую ссылается внешний ключ, называется ссылочной таблицей или родительской таблицей.

Это означает, что внешний ключ является ограничением, что столбец должен ссылаться на первичный ключ ссылочной таблицы.

Итак, вы должны создать все ресурсы созданной строки Segment.

...