在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]
}];
答案 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"
}
]
}
]
}