diff --git a/lib/model-builder.js b/lib/model-builder.js index c27300bd..bdb842cb 100644 --- a/lib/model-builder.js +++ b/lib/model-builder.js @@ -217,18 +217,30 @@ ModelBuilder.prototype.define = function defineClass(className, properties, sett subclassProperties = subclassProperties || {}; subclassSettings = subclassSettings || {}; - + + // Check if subclass redefines the ids + var idFound = false; + for(var k in subclassProperties) { + if(subclassProperties[k].id) { + idFound = true; + break; + } + } + // Merging the properties Object.keys(properties).forEach(function (key) { - // don't inherit the id property - if(key !== 'id' && typeof subclassProperties[key] === 'undefined') { + if(idFound && properties[key].id) { + // don't inherit id properties + return; + } + if(subclassProperties[key] === undefined) { subclassProperties[key] = properties[key]; } }); // Merge the settings Object.keys(settings).forEach(function (key) { - if(typeof subclassSettings[key] === 'undefined') { + if(subclassSettings[key] === undefined) { subclassSettings[key] = settings[key]; } }); @@ -376,7 +388,6 @@ ModelBuilder.prototype.extendModel = function (model, props) { var definition = props[propName]; t.defineProperty(model, propName, definition); }); - t.definitions[model].build(true); }; diff --git a/test/loopback-dl.test.js b/test/loopback-dl.test.js index e095a0cb..c884e9d3 100644 --- a/test/loopback-dl.test.js +++ b/test/loopback-dl.test.js @@ -429,5 +429,40 @@ describe('Load models from json', function () { assert(new m()); } }); + + it('should be able to extend models', function (done) { + var modelBuilder = new ModelBuilder(); + + var User = modelBuilder.define('User', { + name: String, + bio: ModelBuilder.Text, + approved: Boolean, + joinedAt: Date, + age: Number + }); + + var Customer = User.extend('Customer', {customerId: {type: String, id: true}}); + + var customer = new Customer({name: 'Joe', age: 20, customerId: 'c01'}); + + customer.should.be.a('object').and.have.property('name', 'Joe'); + customer.should.have.property('name', 'Joe'); + customer.should.have.property('age', 20); + customer.should.have.property('customerId', 'c01'); + customer.should.not.have.property('bio'); + + // The properties are defined at prototype level + assert.equal(Object.keys(customer).length, 0); + var count = 0; + for(var p in customer) { + if(typeof customer[p] !== 'function') { + count++; + } + } + assert.equal(count, 7); // Please note there is an injected id from User prototype + assert.equal(Object.keys(customer.toObject()).length, 6); + + done(null, customer); + }); });