Allow customizing embedded relation property (#1513)

This commit is contained in:
zbarbuto 2017-11-01 01:25:54 +10:30 committed by Janny
parent 7373476fd8
commit 1d8603c491
2 changed files with 41 additions and 8 deletions

View File

@ -2045,7 +2045,10 @@ RelationDefinition.embedsOne = function(modelFrom, modelToRef, params) {
methods: params.methods,
});
var opts = {type: modelTo};
var opts = Object.assign(
params.options && params.options.property ? params.options.property : {},
{type: modelTo}
);
if (params.default === true) {
opts.default = function() { return new modelTo(); };
@ -2441,9 +2444,14 @@ RelationDefinition.embedsMany = function embedsMany(modelFrom, modelToRef, param
embed: true,
});
modelFrom.dataSource.defineProperty(modelFrom.modelName, propertyName, {
type: [modelTo], default: function() { return []; },
});
var opts = Object.assign(
params.options && params.options.property ? params.options.property : {},
{
type: [modelTo], default: function() { return []; },
}
);
modelFrom.dataSource.defineProperty(modelFrom.modelName, propertyName, opts);
if (typeof modelTo.dataSource.connector.generateId !== 'function') {
modelFrom.validate(propertyName, function(err) {

View File

@ -4283,13 +4283,20 @@ describe('relations', function() {
);
Address = tmp.define('Address', {street: String}, {idInjection: false});
Other = db.define('Other', {name: String});
});
it('can be declared using embedsOne method', function(done) {
Person.embedsOne(Passport, {
default: {name: 'Anonymous'}, // a bit contrived
methods: {check: function() { return true; }},
options: {
property: {
postgresql: {
columnName: 'passport_item',
},
},
},
});
});
it('can be declared using embedsOne method', function(done) {
Person.embedsOne(Address); // all by default
db.automigrate(['Person'], done);
});
@ -4303,6 +4310,11 @@ describe('relations', function() {
p.passportItem.destroy.should.be.a.function;
});
it('respects property options on the embedded property', function() {
Person.definition.properties.passport.should.have.property('postgresql');
Person.definition.properties.passport.postgresql.should.eql({columnName: 'passport_item'});
});
it('should setup a custom method on accessor', function() {
var rel = Person.relations['passportItem'];
rel.defineMethod('other', function() {
@ -4704,7 +4716,15 @@ describe('relations', function() {
});
it('can be declared', function(done) {
Person.embedsMany(Address);
Person.embedsMany(Address, {
options: {
property: {
postgresql: {
dataType: 'json',
},
},
},
});
db.automigrate(['Person'], done);
});
@ -4733,6 +4753,11 @@ describe('relations', function() {
});
});
it('respects property options on the embedded property', function() {
Person.definition.properties.addresses.should.have.property('postgresql');
Person.definition.properties.addresses.postgresql.should.eql({dataType: 'json'});
});
it('should create embedded items on scope', function(done) {
Person.findOne(function(err, p) {
p.addressList.create({street: 'Street 2'}, function(err, address) {