获取Ember数据模型关系类型

时间:2015-07-20 12:23:17

标签: ember.js ember-data

我使用的是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';
}
他们都工作,但他们都觉得我有点笨拙,我不知道他们有多可靠。

所以问题是,哪种方法更可靠?还是有更好的方法?

3 个答案:

答案 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';

只有当您确定"某事物"是关系,因为它会给你假阳性,如果"东西"只是一个模型,计算属性等。