Allow the id(s) to be redefined by subclass
This commit is contained in:
parent
294ebc1ccf
commit
931636eda4
|
@ -218,17 +218,29 @@ 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);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue