From 1d8603c491ce370712688f1403c9d86d8f217175 Mon Sep 17 00:00:00 2001 From: zbarbuto Date: Wed, 1 Nov 2017 01:25:54 +1030 Subject: [PATCH] Allow customizing embedded relation property (#1513) --- lib/relation-definition.js | 16 ++++++++++++---- test/relations.test.js | 33 +++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/relation-definition.js b/lib/relation-definition.js index 85126895..4d44ff51 100644 --- a/lib/relation-definition.js +++ b/lib/relation-definition.js @@ -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) { diff --git a/test/relations.test.js b/test/relations.test.js index 53808087..301143f2 100644 --- a/test/relations.test.js +++ b/test/relations.test.js @@ -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) {