我使用的是Ember 1.13.2和Ember-data 1.13.4
我试图找出模型所具有的关系类型。采用以下示例模型。
// my post model
export default DS.Model.extend({
author: DS.belongsTo('author'),
comments: DS.hasMany('comment')
});
如果comments
是hasMany或belongsTo关系,我如何检查我的代码?
目前我制定了两个有效的解决方案,但他们觉得我有点乱,我确信必须有更好的方法。
一种有效的方法是
var relationship = post.get(relationshipName); // relationshipName = 'comments'
if ( relationship.constructor.toString().indexOf('Array') !== -1 ) {
relationshipType = 'hasMany';
}
else if ( relationship.constructor.toString().indexOf('Object') !== -1 ) {
relationshipType = 'belongsTo';
}
另一种有效的方式
var relationship = post.get(relationshipName); // relationshipName = 'comments'
if (relationship.get('@each')) {
relationshipType = 'hasMany';
}
else {
relationshipType = 'belongsTo';
}
他们都工作,但他们都觉得我有点笨拙,我不知道他们有多可靠。
所以问题是,哪种方法更可靠?还是有更好的方法?
答案 0 :(得分:3)
我认为您正在寻找Model.eachRelationship 例如:
model.eachRelationship(function(name, descriptor) {
if (descriptor.kind === 'hasMany') {
//do something here
}
});
答案 1 :(得分:1)
您可以查看fields
。
import Post from '../models/post'
Ember.get(Post, 'fields').get('comments'); // hasMany
或者,如果您有模型的实例,则可以检查构造函数:
Ember.get(post.constructor, 'fields').get('comments'); // hasMany
答案 2 :(得分:0)
当hasMany返回DS.ManyArray的实例并且belongsTo返回DS.Model时,您可以通过instanceof检查:
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = 'belongsTo';
if(something instanceof DS.ManyArray) {
relationshipType = 'hasMany';
}
更进一步,您可以使用以下代码来确定该字段是否完全不是模型(即计算属性):
var something = post.get(name);
var propertyType = 'unknown';
if(something instanceof DS.ManyArray) {
propertyType = 'relationship:hasMany';
} else if(something instanceof DS.Model) {
propertyType= 'relationship:belongsTo';
} else if(/*whatever you want*/) {
propertyType = /*whatever you want*/;
} else {
propertyType = 'unknown';
}
另一方面,如果您因任何原因不想导入DS,请检查“'关系'属性:
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = relationship.hasOwnProperty('relationship') ? 'hasMany' : 'belongsTo';
只有当您确定"某事物"是关系,因为它会给你假阳性,如果"东西"只是一个模型,计算属性等。