2016-03-21 2 views
0

У меня возникает проблема, когда я пытаюсь связать две модели, которые имеют отношения «один ко многим». По какой-то причине этот запрос вызывает ошибку, несмотря на ссылку на отношения.SequelizeJS Не удается прочитать свойство getTableName неопределенного

Вот мое сообщение об ошибке:

Unhandled rejection TypeError: Cannot read property 'getTableName' of undefined 
    at generateJoinQueries (/Users/user/Desktop/Projects/node/project/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1181:43) 

Это маршрут:

appRoutes.route('/settings') 

    .get(function(req, res, organization){ 
     models.DiscoverySource.findAll({ 
      where: { 
       organizationId: req.user.organizationId 
      }, 
      include: [{ 
       model: models.Organization, through: { attributes: ['organizationName', 'admin', 'discoverySource']} 
      }] 
     }).then(function(organization, discoverySource){ 
      res.render('pages/app/settings.hbs',{ 
       organization: organization, 
       discoverySource: discoverySource 
      }); 
     }) 

    }); 

DiscoverySource:

module.exports = function(sequelize, DataTypes) { 

var DiscoverySource = sequelize.define('discovery_source', { 
    discoverySourceId: { 
     type: DataTypes.INTEGER, 
     field: 'discovery_source_id', 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    discoverySource: { 
     type: DataTypes.STRING, 
     field: 'discovery_source_name' 
    }, 
    organizationId: { 
     type: DataTypes.TEXT, 
     field: 'organization_id' 
    }, 
},{ 
    freezeTableName: true, 
    classMethods: { 
     associate: function(db) { 
      DiscoverySource.belongsTo(db.Organization, {foreignKey: 'organization_id'}); 
     }, 
    }, 
}); 
    return DiscoverySource; 
} 

Организация:

module.exports = function(sequelize, DataTypes) { 

var Organization = sequelize.define('organization', { 
    organizationId: { 
     type: DataTypes.INTEGER, 
     field: 'organization_id', 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    organizationName: { 
     type: DataTypes.STRING, 
     field: 'organization_name' 
    }, 
    admin: DataTypes.STRING 
},{ 
    freezeTableName: true, 
    classMethods: { 
     associate: function(db) { 
      Organization.hasMany(db.DiscoverySource, {foreignKey: 'organization_id'}); 
     }, 
    } 
}); 
    return Organization; 
} 
+0

Возможный дубликат [Ошибка ассоциации Sequelize Ошибка Невозможно прочитать свойство getTableName неопределенного] (http://stackoverflow.com/questions/35974514/sequelize-association-error-cannot-read-property-gettablename-of-undefined) – Milkncookiez

ответ

1

Кажется, это дубликат Sequelize Association Error Cannot read property 'getTableName' of undefined.

Однако, вам нужно переписать запрос выглядеть следующим образом:

models.DiscoverySource.findAll({ 
    attributes: ['discoverySource'], 
    where: { 
     organizationId: req.user.organizationId 
    }, 
    include: [{ 
     model: models.Organization, 
     attributes: ['organizationName', 'admin'] 
    }] 
}) 

Согласно документации Sequelize:

[options.attributes] - список атрибутов, которые вы хотите select или объект с ключами include и exclude.

[options.include []. Attributes] - список атрибутов для выбора из дочерней модели.

[options.include []. Through.where] - Фильтр по модели объединения для отношений, принадлежащих ToMany.

[options.include []. Through.attributes] - список атрибутов для выбора из модели объединения для отношений, принадлежащих toMany.

Таким образом, [options.include[].through] может быть использован только в случае Belongs-To-Many ассоциации, а не Belong-To используемых вами для DiscoverySource и Organization моделей.

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