2017-02-05 6 views
1

Я использую featherjs v2.0.3 с sequelize v3.29.0, и я только что создал три модели, третий из которых имеет отношение к другим двум.Как создать внешние ключи с sequelizejs в проекте feathersjs

Tables

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

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

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

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

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

Feathersjs project structure

Наконец, вот соответствующие части определений модельных 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; 
}; 

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

ответ

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; 
}; 

Затем в ИПВ/услуги/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(); 
+0

Удивительный человек! работает красиво, спасибо большое – transistor

+0

Спасибо @ sam-desota! Я уже некоторое время искал что-то подобное. Есть ли какая-либо документация в любом месте, что вы только что описали? Это очень полезно. Это спасло бы мне несколько часов. – abraganza

 Смежные вопросы

  • Нет связанных вопросов^_^