2014-12-27 3 views
1

У меня было несколько вопросов на сайте, но я все еще не вижу, что я делаю неправильно здесь, поэтому любая помощь будет принята с благодарностью.Sequelize eager loading association with through table

Я получаю сообщение об ошибке:

Organization (organizations) is not associated to User! 

Org Модель:

module.exports = function (sequelize, DataTypes) { 
    return sequelize.define('Organization', { 

     organizationID: { 
      primaryKey: true, 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
     name: { 
      type: DataTypes.STRING, 
      allowNull: false, 
     }, 
     description: { 
      type: DataTypes.STRING, 
      allowNull: true, 
     } 
    }, 
    { 
     tableName: "spa_vOrganization", 
     freezeTableName: true, 
     classMethods: { 
      associate: function (models) { 
       Organization.hasMany(models.User, { 
        as: 'users', 
        through: models.User_Tenant_Organization, 
        foreignKey: 'organizationID' 
       }); 
      } 
     }, 
    }); 
}; 

Модель пользователя:

module.exports = function (sequelize, DataTypes) { 
    return sequelize.define('User', { 
      userID: { 
       primaryKey: true, 
       type: DataTypes.INTEGER(11), 
       allowNull: false, 
      }, 
      password: { 
       type: DataTypes.STRING, 
       allowNull: false, 
      }, 
      email: { 
       type: DataTypes.STRING, 
       allowNull: false, 
      } 
     }, 
     { 
      tableName: "spa_User", 
      freezeTableName: true, 
      classMethods: { 
       associate: function(models) { 
        User.hasMany(models.Organization, { as: "organizations", through: models.User_Tenant_Organization, foreignKey: 'userID'}); 
       } 
      } 
     } 
    ); 
}; 

Матрица стол Модель:

module.exports = function (sequelize, DataTypes) { 
    return sequelize.define('User_Tenant_Organization', { 

     userTenantOrganizationID: { 
      primaryKey: true, 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
     userID: { 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
     organizationID: { 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
     tenantID: { 
      type: DataTypes.INTEGER(11), 
      allowNull: false, 
     }, 
    }, 
    { 
     tableName: "spa_User_Tenant_Organization", 
     freezeTableName: true, 
    }); 
}; 

То, что я пытаюсь сделать, - это просто оттолкнуть пользователя, который их организации надежно загрузили. Вот что я использую:

models.User.findOne({where: { 
     email: body.email 
    }, include: [ {model:models.Organization, as: 'organizations'}]}).complete(function (err, user)  { 
// do something with the user 
} 

Я попытался с и без foreignKey определений на обоих User и Organization, ничего не делает никакой разницы. Я, очевидно, что-то недопонимаю об ассоциациях. Может ли кто-нибудь сказать мне, где я ошибся, пожалуйста?

ответ

1

Я нашел проблему. Соотношения в приведенном выше коде фактически правильны - что было неудачно, мои модели/index.js, которые были автоматически сгенерированы генератором-угловым выражением-сексуалистом

index.js перебирал файлы модели, импортируя их в объект sequelize и сохраняя копию в массиве db [], затем пытается запустить classMethod associate(), но он вызывал models.options.associate() вместо models.associate():

Object.keys(db).forEach(function (modelName) { 
    if (db[modelName].options.hasOwnProperty('associate')) { 
     db[modelName].options.associate(db); 
    } 
}); 

Я исправил это, удалив «.options», и все работает нормально.

Запросить информацию, чтобы исправить проблему, приведено здесь для справки: https://github.com/rayokota/generator-angular-express-sequelize/pull/7