过去几天我使用主键和最后一个版本的Ember Data一直挣扎。
我首先阅读了如何在Breaking Changes file on GitHub上进行操作,但它显然已经过时了。我尝试了several other ways(在IRC上Peter Wagenet的帮助下),但似乎都没有。
我想在我的模型上设置slug
我的主键,而且由于我正在使用MongoDB,我想使用_id
代替id
。
有没有人想出怎么做?我的根本问题是,当我在模型上执行多个App.MyModel.find()
时,模型记录会被加载两次。
答案 0 :(得分:9)
从Ember Data 1.0 beta开始,您在相应的序列化程序上定义primaryKey
。
对于整个应用
App.ApplicationSerializer = DS.RESTSerializer.extend({
primaryKey: '_id'
});
对于单一类型
App.FooSerializer = DS.RESTSerializer.extend({
primaryKey: '_id'
});
您仍然会在模型上将其称为id
,但在转移过程中,Ember Data会将其序列化/反序列化为_id
。
示例:http://emberjs.jsbin.com/OxIDiVU/635/edit
在此处阅读更多相关信息:http://emberjs.com/api/data/classes/DS.RESTSerializer.html#property_primaryKey
答案 1 :(得分:3)
我想把slug作为我的模型上的主键,而且因为我正在使用MongoDB,所以我想使用_id而不是id。
使用适配器的map
API指定应该用作主键的属性:
App.Adapter.map('App.Person', {
primaryKey: '_id'
});
有关详细信息,请参阅serializer.js api docs。如果您需要进一步自定义记录ID的序列化方式,请使用here描述的addId
挂钩。
由于ember-data仍在积极开发中,因此有关此功能的文档有限,可能会在1.0版本之前发生变化。在此期间,请参阅ember-data测试套件以查看此实例的示例。例如:
答案 2 :(得分:1)
如果Nikita建议的解决方案不起作用(对我来说不使用ember-data的修订版11),这里是我在使用RESTAdapter时更改主键的方法:
App.Adapter = DS.RESTAdapter.extend({
serializer: "App.MySerializer"
});
// notice we extend the RESTSerializer, not Serializer!
App.MySerializer = DS.RESTSerializer.extend({
primaryKey: function(type) {
return '_id'; // you get it...
}
});
我知道这可能不会对OP有所帮助,但我仍然发布它,因为它对你们中的一些人可能有所帮助。
答案 3 :(得分:0)
尝试像这样扩展你的适配器:
App.RESTSerializer = DS.RESTSerializer.extend({
init: function() {
this._super();
this.map('App.MyModel', {
primaryKey: "_id"
});
}
});
答案 4 :(得分:0)
我在我的应用程序中使用了MongoDB和Ember-Data 1.0.0-beta.6,并且_id也为我Ember 1.4.0带来了问题。以下是我为解决问题所做的工作,假设返回的JSON数组嵌套在根属性“people”中:
App.ApplicationSerializer = DS.RESTSerializer.extend({
normalizeHash: {
people: function(hash) {
hash.id = hash._id;
delete hash._id;
return hash;
}
}
});
当然,这是一个应用程序范围的序列化程序,但您可以使用类似App.MyPathSerializer = DS.RESTSerializer.extend({ ... });