2016-11-19 4 views
0

Ich habe zwei "Modelle" in meiner Anwendung, die in verschiedene Dateien verzweigt sind:belongsTo assoziieren mit scheint nicht zu funktionieren

ApplicationSession.model.js

module.exports = function(sequelize, DataTypes) { 

    const { INTEGER, DATE } = DataTypes; 

    var ApplicationSession = sequelize.define("applicationSession", { 
     sessionStart: DATE, 
     sessionEnd: DATE 
    }, { 
     associate: (models) => { 
      ApplicationSession.belongsTo(models.User, { 
       foreignKey: 'userId', 
       as: 'User', 
      }); 
     } 
    }); 

    return ApplicationSession; 
}; 

User.model.js

module.exports = function(sequelize, DataTypes) { 

    const { STRING, INTEGER, DATE } = DataTypes; 

    var User = sequelize.define("user", { 
     name: STRING 
    }, { 
     associate: (models) => { 
      User.hasMany(models.ApplicationSession); 
     } 
    }); 

    return User; 
}; 

Wenn die Tabellen speichern (droping/Recreating) force: true und manuellen Abwurf nur für geistige Gesundheit, gibt es nie ein Feld für den Benutzer erstellt.

Hier ist, wie ich meine verschiedenen Modellen bin Laden

import fs from 'fs'; 
import path from 'path'; 
import sequelize from '../connection'; 
var exports = {}; 

fs.readdirSync(__dirname).forEach(fileName => { 
    if(~fileName.indexOf('.model.js')) { 
     const subname = fileName.replace('.model.js', ''); 

     const model = sequelize.import(path.join(__dirname, fileName)); 
     exports[subname] = model; 
    } 

}); 

export default exports; 

Wenn alle Modelle in einer einzigen Datei deklariert sind, ich X.belongsTo(Y) ohne Probleme nutzen können, so dass ich dachte, ich würde versuchen, diese zu die Unterseite meines sequelize.import nennt

exports['ApplicationSession'].belongsTo(exports['User'], { as: 'User', foreignKey: 'userId' }); 
    exports['User'].hasMany(exports['ApplicationSession']); 

jedoch, dass ein anderer Fehler generiert:

/node_modules/sequelize/lib/associations/mixin.js:96 
     throw new Error(this.name + '.' + Utils.lowercaseFirst(Type.toString()) + ' called with something that\'s not an instance of Sequelize.Model'); 
    ^

Error: applicationSession.function BelongsTo(source, target, options) 

Was kann ich tun, damit Beziehungen funktionieren?

Antwort

0

Sie müssen Ihrem Modul zum Laden von Modellen noch eine weitere hinzufügen, damit die Verknüpfungen funktionieren.

fs.readdirSync(__dirname).forEach(fileName => { 
    if(~fileName.indexOf('.model.js')) { 
     const subname = fileName.replace('.model.js', ''); 
     const model = sequelize.import(path.join(__dirname, fileName)); 
     exports[subname] = model; 
    } 
}); 

// You need to check for every model if it has `associate` class method 
// and execute it 
Object.keys(exports).forEach(function(modelName) { 
    if ("associate" in exports[modelName]) { 
    exports[modelName].associate(db); 
    } 
}); 

Ich sah auch einen anderen Fehler in Ihrem Code. Die in Ihren Modellen definierte Klassenmethode associate sollte um die Eigenschaft classMethods gewickelt werden.

Es sollte wie folgt aussehen:

var ApplicationSession = sequelize.define("applicationSession", { 
    sessionStart: DATE, 
    sessionEnd: DATE 
}, { 
    // Add this 
    classMethods: { 
     associate: (models) => { 
      ApplicationSession.belongsTo(models.User, { 
       foreignKey: 'userId', 
       as: 'User', 
      }); 
     } 
    } 
}); 

Sie die Beispiele von sequelize in GitHub folgen kann.

+0

Dies war ein Fehler in meiner Frage, sie sind so benannt, sorry. Bearbeiten: Die Frage – Hobbyist

+0

mein Anawer aktualisiert – drinchev

Verwandte Themen