我可以在Ember.js的一边建立多对多的关系吗?

时间:2013-07-17 22:40:36

标签: ember.js ember-data

Ember tutorial中,多对多关系被引入为:

App.Post = DS.Model.extend({
  tags: DS.hasMany('App.Tag')
});

App.Tag = DS.Model.extend({
  posts: DS.hasMany('App.Post')
});

是否可以只放置其中一个DS.hasMany关系。例如(让我知道我的代码是否以任何方式不正确):

App.Post = DS.Model.extend({
  postid: DS.attr('number'),
  content: DS.attr('string'),
  tags: DS.hasMany('App.Tag')
});

App.Tag = DS.Model.extend({
  tagid: DS.attr('number'),
  name: DS.attr('string')
});

这样可以在这些夹具适配器设置中使用JSON:

App.Tag.FIXTURES = [{
    tagid: 1111,
    name: 'Ember.js',
}, {
    tagid: 2222,
    name: 'Javascript'
}];

App.Post.FIXTURES = [{
    postid: 3000,
    content: 'A JS Question'
    tags: [2222]
}, {
    postid: 4000,
    content: 'An Ember.js Question',
    tags: [1111, 2222]
}];

所以基本上只是在父母中建立了多对多关系,这就是为什么我没有在posts: DS.hsaMany('App.Post')模型中包含App.Tag的原因。

我正在做什么好吗?如果是这样,我应该在两个模型中何时需要DS.hasMany? 如果没有,请同样更正Fixture JSON。

如果适配器的类型有所不同,请解释它们的不同之处(相关question)。


更新:由于直觉上与我一起澄清了这种关系必须是多对多的,让我再试一次:

App.Post = DS.Model.extend({
  postid: DS.attr('number'),
  content: DS.attr('string'),
  tags: DS.hasMany('App.Tag')
});

App.Tag = DS.Model.extend({
  tagid: DS.attr('number'),
  name: DS.attr('string'),
  posts: DS.hasMany('App.Post')
});

Fixture适配器设置是否可以像这样,关系仅在帖子中定义?

App.Tag.FIXTURES = [{
    tagid: 1111,
    name: 'Ember.js',
}, {
    tagid: 2222,
    name: 'Javascript'
}];

App.Post.FIXTURES = [{
    postid: 3000,
    content: 'A JS Question'
    tags: [2222]
}, {
    postid: 4000,
    content: 'An Ember.js Question',
    tags: [1111, 2222]
}];

或者它必须是这样的,其中两者都定义了关系。如果是这样,信息不会是多余的吗?但冗余很糟糕。 :(

App.Tag.FIXTURES = [{
    tagid: 1111,
    name: 'Ember.js',
    posts: [4000]
}, {
    tagid: 2222,
    name: 'Javascript',
    posts: [3000, 4000]
}];

App.Post.FIXTURES = [{
    postid: 3000,
    content: 'A JS Question'
    tags: [2222]
}, {
    postid: 4000,
    content: 'An Ember.js Question',
    tags: [1111, 2222]
}];

2 个答案:

答案 0 :(得分:2)

  

是否可以只放入其中一个DS.hasMany关系。

是的,但那将是一对多的关系。

  

所以基本上在父母中建立了多对多关系,这就是为什么我没有在App.Tag模型中包含帖子:DS.hasMany('App.Post')。

你要做的事情不起作用,你需要一对多的关系,你的模型应该是这样的:

App.Post = DS.Model.extend({
  postid: DS.attr('number'),
  content: DS.attr('string'),
  tags: DS.hasMany('App.Tag')
});

App.Tag = DS.Model.extend({
  tagid: DS.attr('number'),
  name: DS.attr('string')
  post: DS.belongsTo('App.Post')
});

然后通讯员FIXTURES:

App.Tag.FIXTURES = [{
  tagid: 1111,
  name: 'Ember.js',
  post: 4000
}, {
  tagid: 2222,
  name: 'Javascript',
  post: 4000
}];

App.Post.FIXTURES = [{
  postid: 4000,
  content: 'An Ember.js Question',
  tags: [1111, 2222]
}];
  

我正在做什么好吗?如果是这样,我应该何时在两个模型中都需要DS.hasMany?

这不是很好,恕我直言(并且由于tag的性质),应该可以为许多帖子分配tag,并且可以将许多标签分配给{{1 }}。所以我们最终会使用你提到的ember教程中的多对多关系,我猜是有原因的。

所以对你的问题的最终答案是:我可以在ember-js 的一边建立多对多的关系 - 不!

<强>更新

我已经提出了一个小例子,多对多关系如何运作,see here

希望它有所帮助。

答案 1 :(得分:0)

您可以使用RESTAdapter执行此操作。这样,您将标签与帖子一起加载。但正如直观像素正确指出的那样,这不是真正的多对多关系。

App = Ember.Application.create();

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return App.Post.find();
  }
});

App.Adapter = DS.RESTAdapter.extend();

App.Adapter.map('App.Post', {
  tags: { embedded: 'load' }
});

App.Store = DS.Store.extend({
  adapter: App.Adapter.create({
    namespace: 'api'
  })
});

App.Post = DS.Model.extend({
  content: DS.attr('string'),
  tags: DS.hasMany('App.Tag')
});

App.Tag = DS.Model.extend({
  name: DS.attr('string')
});

您的JSON有效负载将是:

{
  "posts": [
    {
      "id": 4000,
      "content": "An Ember.js Question",
      "tags": [
        {
          "id": 1,
          "name": "ember.js"
        },
        {
          "id": 2,
          "name": "javascript"
        },
        {
          "id": 3,
          "name": "ember-data"
        }
      ]
    }
  ]
}