diff --git a/lib/datasource.js b/lib/datasource.js index 8b5d51ab..774362c7 100644 --- a/lib/datasource.js +++ b/lib/datasource.js @@ -399,7 +399,8 @@ DataSource.prototype.defineRelations = function (modelClass, relations) { var params = { foreignKey: relation.foreignKey, as: name, - model: model + model: model, + options: relation.options }; if (throughModel) { params.through = throughModel; @@ -418,7 +419,8 @@ DataSource.prototype.defineRelations = function (modelClass, relations) { foreignKey: relation.foreignKey, as: name, model: targetModel, - through: model + through: model, + options: relation.options }; modelClass[relation.type].call(modelClass, name, params); } @@ -444,7 +446,8 @@ DataSource.prototype.defineRelations = function (modelClass, relations) { var params = { foreignKey: r.foreignKey, as: rn, - model: targetModel + model: targetModel, + options: r.options }; if (throughModel) { params.through = throughModel; diff --git a/lib/include.js b/lib/include.js index f276b3d9..342a2bde 100644 --- a/lib/include.js +++ b/lib/include.js @@ -101,6 +101,12 @@ Inclusion.include = function (objects, include, cb) { return; } + // Just skip if inclusion is disabled + if (relation.options.disableInclude) { + cb(); + return; + } + // Calling the relation method for each object async.each(objs, function (obj, callback) { if(relation.type === 'belongsTo') { diff --git a/lib/relation-definition.js b/lib/relation-definition.js index 13d1914e..1b590bf3 100644 --- a/lib/relation-definition.js +++ b/lib/relation-definition.js @@ -70,6 +70,7 @@ function RelationDefinition(definition) { this.keyThrough = definition.keyThrough; this.multiple = (this.type !== 'belongsTo' && this.type !== 'hasOne'); this.properties = definition.properties || {}; + this.options = definition.options || {}; this.scope = definition.scope; } @@ -363,7 +364,8 @@ RelationDefinition.hasMany = function hasMany(modelFrom, modelTo, params) { modelTo: modelTo, multiple: true, properties: params.properties, - scope: params.scope + scope: params.scope, + options: params.options }); if (params.through) { @@ -872,7 +874,8 @@ RelationDefinition.belongsTo = function (modelFrom, modelTo, params) { modelFrom: modelFrom, keyFrom: fk, keyTo: idName, - modelTo: modelTo + modelTo: modelTo, + options: params.options }); modelFrom.dataSource.defineForeignKey(modelFrom.modelName, fk, modelTo.modelName); @@ -1082,7 +1085,8 @@ RelationDefinition.hasOne = function (modelFrom, modelTo, params) { keyFrom: pk, keyTo: fk, modelTo: modelTo, - properties: params.properties + properties: params.properties, + options: params.options }); modelFrom.dataSource.defineForeignKey(modelTo.modelName, fk, modelFrom.modelName); diff --git a/test/include.test.js b/test/include.test.js index 72980903..394862a2 100644 --- a/test/include.test.js +++ b/test/include.test.js @@ -1,7 +1,7 @@ // This test written in mocha+should.js var should = require('./init.js'); -var db, User, Post, Passport, City, Street, Building, Assembly, Part; +var db, User, AccessToken, Post, Passport, City, Street, Building, Assembly, Part; describe('include', function () { @@ -141,6 +141,19 @@ describe('include', function () { }); }); + it('should not fetch User - AccessTokens', function (done) { + User.find({include: ['accesstokens']}, function (err, users) { + should.not.exist(err); + should.exist(users); + users.length.should.be.ok; + users.forEach(function (user) { + var userObj = user.toJSON(); + userObj.should.not.have.property('accesstokens'); + }); + done(); + }); + }); + it('should support hasAndBelongsToMany', function (done) { Assembly.destroyAll(function(err) { @@ -185,6 +198,9 @@ function setup(done) { name: String, age: Number }); + AccessToken = db.define('AccessToken', { + token: String + }); Passport = db.define('Passport', { number: String }); @@ -195,6 +211,10 @@ function setup(done) { Passport.belongsTo('owner', {model: User}); User.hasMany('passports', {foreignKey: 'ownerId'}); User.hasMany('posts', {foreignKey: 'userId'}); + User.hasMany('accesstokens', { + foreignKey: 'userId', + options: {disableInclude: true} + }); Post.belongsTo('author', {model: User, foreignKey: 'userId'}); Assembly = db.define('Assembly', { @@ -226,10 +246,22 @@ function setup(done) { function (items) { createdUsers = items; createPassports(); + createAccessTokens(); } ); } + function createAccessTokens() { + clearAndCreate( + AccessToken, + [ + {token: '1', userId: createdUsers[0].id}, + {token: '2', userId: createdUsers[1].id} + ], + function (items) {} + ); + } + function createPassports() { clearAndCreate( Passport,