Skip to content

Commit ed84ddf

Browse files
committed
fix relationship name for belongsTo polymorphic
1 parent 5472e59 commit ed84ddf

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

lib/patch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ function belongsToRemoting (relationName, relation, define) {
103103
},
104104
returns: {
105105
arg: 'result',
106-
type: relation.modelTo.modelName,
106+
type: modelName,
107107
root: true
108108
}
109109
}, findBelongsToRelationshipsFunc);

lib/serialize.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ module.exports = function (app, defaults) {
8383
requestedIncludes = ctx.req.remotingContext.args.filter.include;
8484
}
8585
options = {
86+
app: app,
8687
model: model,
8788
method: ctx.method.name,
8889
primaryKeyField: primaryKeyField,

lib/serializer.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,14 @@ function parseRelations (data, relations, options) {
195195
var fk = data[fkName];
196196

197197
var fromType = utils.pluralForModel(relation.modelFrom);
198-
var toType = utils.pluralForModel(relation.modelTo);
198+
var toType = '';
199+
if (relation.polymorphic) {
200+
var discriminator = relation.polymorphic.discriminator;
201+
var model = options.app.models[data[discriminator]];
202+
toType = utils.pluralForModel(model);
203+
} else {
204+
toType = utils.pluralForModel(relation.modelTo);
205+
}
199206

200207
// Relationship `links` should always be defined unless this is a
201208
// relationship request

test/belongsToPolymorphic.test.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
var request = require('supertest');
2+
var loopback = require('loopback');
3+
var expect = require('chai').expect;
4+
var JSONAPIComponent = require('../');
5+
var app;
6+
var ds;
7+
var Post;
8+
var File;
9+
10+
describe('loopback json api belongsTo polymorphic relationships', function () {
11+
beforeEach(function () {
12+
app = loopback();
13+
app.set('legacyExplorer', false);
14+
ds = loopback.createDataSource('memory');
15+
Post = ds.createModel('post', {
16+
id: {type: Number, id: true},
17+
title: String,
18+
content: String
19+
});
20+
Post.settings.plural = 'posts';
21+
app.model(Post);
22+
23+
File = ds.createModel('file', {
24+
id: {type: Number, id: true},
25+
fileName: String,
26+
parentId: Number,
27+
parentType: String
28+
});
29+
File.settings.plural = 'files';
30+
File.belongsTo('parent', {
31+
polymorphic: {
32+
foreignKey: 'parentId',
33+
discriminator: 'parentType'
34+
}
35+
});
36+
app.model(File);
37+
38+
app.use(loopback.rest());
39+
JSONAPIComponent(app);
40+
});
41+
42+
describe('File belonging to a Post', function () {
43+
beforeEach(function (done) {
44+
Post.create({
45+
title: 'Post One',
46+
content: 'Content'
47+
}, function (err, post) {
48+
expect(err).to.equal(null);
49+
File.create({
50+
fileName: 'blah.jpg',
51+
parentId: post.id,
52+
parentType: 'post'
53+
}, done);
54+
});
55+
});
56+
57+
it('should have a relationship to Post', function (done) {
58+
request(app).get('/files/1')
59+
.end(function (err, res) {
60+
expect(err).to.equal(null);
61+
expect(res.body.errors).to.equal(undefined);
62+
expect(res.body.data.relationships.parent).to.be.an('object');
63+
done();
64+
});
65+
});
66+
});
67+
});

0 commit comments

Comments
 (0)