Skip to content

Commit adea1e3

Browse files
issue js-data#118: Allow multiple relationships to same model
1 parent f4a390f commit adea1e3

File tree

4 files changed

+58
-33
lines changed

4 files changed

+58
-33
lines changed

karma.start.js

+20-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
var $rootScope, $q, $log, $timeout, DSHttpAdapterProvider, DSProvider, DSLocalStorageAdapter, DS, DSUtils, DSHttpAdapter, app, $httpBackend, p1, p2, p3, p4, p5;
33

44
var user1, organization2, comment3, profile4;
5-
var comment11, comment12, comment13, organization14, profile15, user10, user16, user17, user18, organization15, user20, comment19, user22, profile21;
5+
var comment11, comment12, comment13, organization14, profile15, user10, user16, user17, user18, organization15, user19, user20, comment19, user22, profile21;
66

77
var lifecycle = {};
88

@@ -183,12 +183,20 @@ function startInjector() {
183183
DS.defineResource({
184184
name: 'comment',
185185
relations: {
186-
belongsTo: {
187-
user: {
188-
localField: 'user',
189-
localKey: 'userId'
186+
belongsTo: [
187+
{
188+
user: {
189+
localField: 'user',
190+
localKey: 'userId'
191+
}
192+
},
193+
{
194+
user: {
195+
localField: 'approvedByUser',
196+
localKey: 'approvedBy'
197+
}
190198
}
191-
}
199+
]
192200
}
193201
});
194202
$log = _$log_;
@@ -294,13 +302,19 @@ function startInjector() {
294302
user18
295303
]
296304
};
305+
user19 = {
306+
id: 19,
307+
name: 'test user 19'
308+
};
297309
user20 = {
298310
id: 20,
299311
name: 'test user 20'
300312
};
301313
comment19 = {
302314
content: 'test comment 19',
303315
id: 19,
316+
approvedBy: 19,
317+
approvedByUser: user19,
304318
userId: 20,
305319
user: user20
306320
};

src/datastore/async_methods/loadRelations.js

+24-19
Original file line numberDiff line numberDiff line change
@@ -87,30 +87,35 @@ function loadRelations(resourceName, instance, relations, options) {
8787
var tasks = [];
8888
var fields = [];
8989

90-
DS.utils.forOwn(definition.relations, function (relation, type) {
91-
DS.utils.forOwn(relation, function (def, relationName) {
92-
if (DS.utils.contains(relations, relationName)) {
93-
var task;
94-
var params = {};
95-
params[def.foreignKey] = instance[definition.idAttribute];
90+
DS.utils.forOwn(definition.relations, function (definedRelations, type) {
91+
if (!(definedRelations instanceof Array)) {
92+
definedRelations = [definedRelations];
93+
}
94+
definedRelations.forEach(function (definedRelation) {
95+
DS.utils.forOwn(definedRelation, function (def, relationName) {
96+
if (DS.utils.contains(relations, relationName)) {
97+
var task;
98+
var params = {};
99+
params[def.foreignKey] = instance[definition.idAttribute];
96100

97-
if (type === 'hasMany') {
98-
task = DS.findAll(relationName, params, options);
99-
} else if (type === 'hasOne') {
100-
if (def.localKey && instance[def.localKey]) {
101-
task = DS.find(relationName, instance[def.localKey], options);
102-
} else if (def.foreignKey) {
101+
if (type === 'hasMany') {
103102
task = DS.findAll(relationName, params, options);
103+
} else if (type === 'hasOne') {
104+
if (def.localKey && instance[def.localKey]) {
105+
task = DS.find(relationName, instance[def.localKey], options);
106+
} else if (def.foreignKey) {
107+
task = DS.findAll(relationName, params, options);
108+
}
109+
} else {
110+
task = DS.find(relationName, instance[def.localKey], options);
104111
}
105-
} else {
106-
task = DS.find(relationName, instance[def.localKey], options);
107-
}
108112

109-
if (task) {
110-
tasks.push(task);
111-
fields.push(def.localField);
113+
if (task) {
114+
tasks.push(task);
115+
fields.push(def.localField);
116+
}
112117
}
113-
}
118+
});
114119
});
115120
});
116121

src/datastore/sync_methods/inject.js

+13-8
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,20 @@ function _inject(definition, resource, attrs) {
115115

116116
function _injectRelations(definition, injected) {
117117
var DS = this;
118-
DS.utils.forOwn(definition.relations, function (relation, type) {
119-
DS.utils.forOwn(relation, function (def, relationName) {
120-
if (DS.definitions[relationName] && injected[def.localField]) {
121-
try {
122-
injected[def.localField] = DS.inject(relationName, injected[def.localField]);
123-
} catch (err) {
124-
DS.$log.error(errorPrefix(definition.name) + 'Failed to inject ' + type + ' relation: "' + relationName + '"!', err);
118+
DS.utils.forOwn(definition.relations, function (definedRelations, type) {
119+
if (!(definedRelations instanceof Array)) {
120+
definedRelations = [definedRelations];
121+
}
122+
definedRelations.forEach(function (definedRelation) {
123+
DS.utils.forOwn(definedRelation, function (def, relationName) {
124+
if (DS.definitions[relationName] && injected[def.localField]) {
125+
try {
126+
injected[def.localField] = DS.inject(relationName, injected[def.localField]);
127+
} catch (err) {
128+
DS.$log.error(errorPrefix(definition.name) + 'Failed to inject ' + type + ' relation: "' + relationName + '"!', err);
129+
}
125130
}
126-
}
131+
});
127132
});
128133
});
129134
}

test/integration/datastore/sync_methods/inject.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ describe('DS.inject(resourceName, attrs)', function () {
185185

186186
// comment19 relations
187187
assert.deepEqual(DS.get('user', 20), user20);
188+
assert.deepEqual(DS.get('user', 19), user19);
188189

189190
// profile21 relations
190191
assert.deepEqual(DS.get('user', 22), user22);

0 commit comments

Comments
 (0)