3

Ember 教程中,多对多关系被介绍为:

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。

如果适配器的类型有所不同,还请说明它们有何不同(相关问题)。


更新:由于intuitivepixel向我澄清了关系必须是多对多的,让我再试一次:

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')
});

夹具适配器设置可以像这样,关系仅在帖子中定义吗?

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]
}];
4

2 回答 2

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 在两个模型中?

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

因此,您问题的最终答案是:我可以在 ember-js 中仅在一侧建立多对多关系吗 - 不!

更新

我已经举了一个小例子,多对多关系如何工作,请参见此处

希望能帮助到你。

于 2013-07-17T23:20:18.540 回答
0

您可以使用 RESTAdapter 来完成。这样,您将标签与帖子一起加载。但正如intuitivepixel 正确指出的那样,这并不是真正的多对多关系。

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"
        }
      ]
    }
  ]
}
于 2013-07-25T17:12:40.773 回答