diff --git a/lib/abstract-class.js b/lib/abstract-class.js index 12e6bf4f..a8cb79a5 100644 --- a/lib/abstract-class.js +++ b/lib/abstract-class.js @@ -666,6 +666,13 @@ AbstractClass.prototype.reset = function () { AbstractClass.hasMany = function hasMany(anotherClass, params) { var methodName = params.as; // or pluralize(anotherClass.modelName) var fk = params.foreignKey; + + this.relations[params['as']] = { + type: 'hasMany', + keyFrom: 'id', + keyTo: params['foreignKey'], + multiple: true + }; // each instance of this class should have method named // pluralize(anotherClass.modelName) // which is actually just anotherClass.all({where: {thisModelNameId: this.id}}, cb); @@ -733,6 +740,13 @@ AbstractClass.belongsTo = function (anotherClass, params) { var methodName = params.as; var fk = params.foreignKey; + this.relations[params['as']] = { + type: 'belongsTo', + keyFrom: params['foreignKey'], + keyTo: 'id', + multiple: false + }; + this.schema.defineForeignKey(this.modelName, fk); this.prototype['__finders__'] = this.prototype['__finders__'] || {}; diff --git a/lib/schema.js b/lib/schema.js index 78ded775..d316eaf3 100644 --- a/lib/schema.js +++ b/lib/schema.js @@ -157,6 +157,7 @@ Schema.prototype.define = function defineClass(className, properties, settings) hiddenProperty(NewClass, 'modelName', className); hiddenProperty(NewClass, 'cache', {}); hiddenProperty(NewClass, 'mru', []); + hiddenProperty(NewClass, 'relations', {}); // inherit AbstractClass methods for (var i in AbstractClass) { diff --git a/test/common_test.js b/test/common_test.js index 1dd955f9..adc87eb9 100644 --- a/test/common_test.js +++ b/test/common_test.js @@ -432,6 +432,29 @@ function testOrm(schema) { }); }); + if ( + !schema.name.match(/redis/) && + schema.name !== 'memory' && + schema.name !== 'neo4j' && + schema.name !== 'cradle' + ) + it('relations key is working', function (test) { + test.ok(User.relations, 'Relations key should be defined'); + test.ok(User.relations.posts, 'posts relation should exist on User'); + test.equal(User.relations.posts.type, 'hasMany', 'Type of hasMany relation is hasMany'); + test.equal(User.relations.posts.multiple, true, 'hasMany relations are multiple'); + test.equal(User.relations.posts.keyFrom, 'id', 'keyFrom is primary key of model table'); + test.equal(User.relations.posts.keyTo, 'userId', 'keyTo is foreign key of related model table'); + + test.ok(Post.relations, 'Relations key should be defined'); + test.ok(Post.relations.author, 'author relation should exist on Post'); + test.equal(Post.relations.author.type, 'belongsTo', 'Type of belongsTo relation is belongsTo'); + test.equal(Post.relations.author.multiple, false, 'belongsTo relations are not multiple'); + test.equal(Post.relations.author.keyFrom, 'userId', 'keyFrom is foreign key of model table'); + test.equal(Post.relations.author.keyTo, 'id', 'keyTo is primary key of related model table'); + test.done(); + }); + it('should handle hasMany relationship', function (test) { User.create(function (err, u) { if (err) return console.log(err); @@ -449,7 +472,6 @@ function testOrm(schema) { }); }); - if ( !schema.name.match(/redis/) && schema.name !== 'memory' &&