feat: omit default fn for embedsMany (#1532)
* feat: omit default fn for embeds many * fix: apply feedback
This commit is contained in:
parent
e095b77048
commit
01427b1755
|
@ -2471,8 +2471,10 @@ RelationDefinition.embedsMany = function embedsMany(modelFrom, modelToRef, param
|
|||
|
||||
var opts = Object.assign(
|
||||
params.options && params.options.property ? params.options.property : {},
|
||||
params.options && params.options.omitDefaultEmbeddedItem ? {type: [modelTo]} :
|
||||
{
|
||||
type: [modelTo], default: function() { return []; },
|
||||
type: [modelTo],
|
||||
default: function() { return []; },
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -2920,9 +2922,8 @@ EmbedsMany.prototype.create = function(targetModelData, options, cb) {
|
|||
targetModelData = targetModelData || {};
|
||||
cb = cb || utils.createPromiseCallback();
|
||||
|
||||
var embeddedList = this.embeddedList();
|
||||
|
||||
var inst = this.callScopeMethod('build', targetModelData);
|
||||
var embeddedList = this.embeddedList();
|
||||
|
||||
var updateEmbedded = function(callback) {
|
||||
if (modelInstance.isNewRecord()) {
|
||||
|
@ -2975,6 +2976,7 @@ EmbedsMany.prototype.build = function(targetModelData) {
|
|||
var modelInstance = this.modelInstance;
|
||||
var forceId = this.definition.options.forceId;
|
||||
var persistent = this.definition.options.persistent;
|
||||
var propertyName = this.definition.keyFrom;
|
||||
var connector = modelTo.dataSource.connector;
|
||||
|
||||
var pk = this.definition.keyTo;
|
||||
|
@ -3008,8 +3010,10 @@ EmbedsMany.prototype.build = function(targetModelData) {
|
|||
|
||||
if (this.definition.options.prepend) {
|
||||
embeddedList.unshift(inst);
|
||||
modelInstance[propertyName] = embeddedList;
|
||||
} else {
|
||||
embeddedList.push(inst);
|
||||
modelInstance[propertyName] = embeddedList;
|
||||
}
|
||||
|
||||
this.prepareEmbeddedInstance(inst);
|
||||
|
|
|
@ -5021,6 +5021,71 @@ describe('relations', function() {
|
|||
});
|
||||
});
|
||||
|
||||
describe('embedsMany - omit default value for embedded item', function() {
|
||||
before(function(done) {
|
||||
tmp = getTransientDataSource({defaultIdType: Number});
|
||||
Person = db.define('Person', {name: String});
|
||||
Address = tmp.define('Address', {street: String});
|
||||
Address.validatesPresenceOf('street');
|
||||
|
||||
db.automigrate(['Person'], done);
|
||||
});
|
||||
|
||||
it('can be declared', function(done) {
|
||||
Person.embedsMany(Address, {
|
||||
options: {
|
||||
omitDefaultEmbeddedItem: true,
|
||||
property: {
|
||||
postgresql: {
|
||||
dataType: 'json',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
db.automigrate(['Person'], done);
|
||||
});
|
||||
|
||||
it('should not set default value for embedded item', function() {
|
||||
var p = new Person({name: 'Fred'});
|
||||
p.should.have.property('addresses', undefined);
|
||||
});
|
||||
|
||||
it('should create embedded items on scope', function(done) {
|
||||
Person.create({name: 'Fred'}, function(err, p) {
|
||||
p.addressList.create({street: 'Street 1'}, function(err, address) {
|
||||
if (err) return done(err);
|
||||
should.exist(address.id);
|
||||
address.street.should.equal('Street 1');
|
||||
p.addresses.should.be.array;
|
||||
p.addresses.should.have.length(1);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should build embedded items', function(done) {
|
||||
Person.findOne(function(err, p) {
|
||||
p.addresses.should.have.length(1);
|
||||
p.addressList.build({id: 'home', street: 'Home'});
|
||||
p.addressList.build({id: 'work', street: 'Work'});
|
||||
p.addresses.should.have.length(3);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should not create embedded from attributes - relation name', function(done) {
|
||||
var addresses = [
|
||||
{id: 'home', street: 'Home Street'},
|
||||
{id: 'work', street: 'Work Street'},
|
||||
];
|
||||
Person.create({name: 'Wilma', addressList: addresses}, function(err, p) {
|
||||
if (err) return done(err);
|
||||
p.should.have.property('addresses', undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('embedsMany - numeric ids + forceId', function() {
|
||||
before(function(done) {
|
||||
tmp = getTransientDataSource();
|
||||
|
|
Loading…
Reference in New Issue