Как создать внешние ключи с помощью sequenceizejs в проекте перьев js

Я использую перо js v2.0.3 с продолжением v3.29.0, и я только что создал три модели, третья из которых связана с двумя другими.

Таблицы

Я использовал перья-cli для создания сервисов для каждого из них, а затем редактировал файл модели каждого из них.

Пока все хорошо, таблицы созданы (с использованием PostgreSQL), созданы индексы, перья js хорошо заботятся о CRUD, но пока не о внешних ключах.

Итак, когда я пытаюсь рассказать перьям об отношениях между моделями, у меня возникают проблемы.

Когда я добавляю role_permission.belongsTo(permissions) к модели role_permission, я получаю эту ошибку: ReferenceError: permissions is not defined

Как я видел в документации Sequelize, модели определены в одном и том же «документе», поэтому я подозреваю, что проблема где-то там, но я не понимаю, что нужно делать.

Структура проекта Feathersjs

Наконец, вот соответствующие части определений моделей permission и role_permission:

// permission-model.js - A sequelize model

module.exports = function(sequelize) {
    const permission = sequelize.define('permissions', {
        permission_id: {
            type: Sequelize.UUID,
            defaultValue: Sequelize.UUIDV1,
            primaryKey: true,
            allowNull: false
        }...
    }, ...);

    permission.sync();

    return permission;
};

// role_permission-model.js - A sequelize model

module.exports = function(sequelize) {
    const role_permission = sequelize.define('role_permissions', {
        permission_id: {
            type: Sequelize.UUID,
            allowNull: false
        }...
    }, ...);

    role_permission.belongsTo(permissions) //<-- undefined?

    role_permission.sync();

    return role_permission;
};

Есть ли у вас какие-либо указатели, которые помогут мне решить эту проблему? Спасибо!


person transistor    schedule 05.02.2017    source источник


Ответы (2)


Вам необходимо импортировать модель разрешений. Но это может или не может быть определено еще.

Вот метод, который я обнаружил у @mrpatiwi на github, чтобы обеспечить загрузку каждой модели до установки ассоциаций.

Во-первых, когда вам нужно определить отношения, добавьте classMethod с именем Associate, который принимает все модели и устанавливает отношения.

module.exports = function(sequelize) {
  const role_permission = sequelize.define('role_permisson', {
    ...
  }, {
    classMethods: {
      associate(models) {
        role_permission.belongsTo(models.permission);
      },
    },
  });

  // Don't add role_premission.sync() here

  return role_permission;
};

Затем в src/services/index.js в конце функции module.exports добавьте:

// Setup relationships
const models = sequelize.models;
Object.keys(models)
  .map(name => models[name])
  .filter(model => model.associate)
  .forEach(model => model.associate(models));

sequalize.sync();
person Sam DeSota    schedule 05.02.2017
comment
Спасибо @sam-desota! Я искал что-то вроде этого некоторое время. Есть ли где-нибудь документация по тому, что вы только что подробно описали? Это очень полезно. Это сэкономило бы мне кучу часов. - person abraganza; 05.02.2017

У меня была такая же проблема, и я решил ее, просто изменив это:

role_permission.belongsTo(permissions)

к этому:

role_permission.belongsTo(models.permissions)

(Я использовал интерфейс командной строки Feathers для создания моделей сегодня, 9 августа 2018 г.)

person Luke Farrugia    schedule 08.08.2018