将主键与Ember数据一起使用

时间:2013-02-11 22:18:33

标签: ember.js ember-data

过去几天我使用主键和最后一个版本的Ember Data一直挣扎

我首先阅读了如何在Breaking Changes file on GitHub上进行操作,但它显然已经过时了。我尝试了several other ways(在IRC上Peter Wagenet的帮助下),但似乎都没有。

我想在我的模型上设置slug我的主键,而且由于我正在使用MongoDB,我想使用_id代替id

有没有人想出怎么做?我的根本问题是,当我在模型上执行多个App.MyModel.find()时,模型记录会被加载两次。

5 个答案:

答案 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)

我在我的应用程序中使用了MongoDBEmber-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({ ... });

的内容将其限制为特定路径