Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using primary keys with Ember Data

I've been struggling for the past few days with primary keys and the last version of Ember Data.

I first read how to do it on the Breaking Changes file on GitHub, but it's apparently outdated. I tried several other ways (with the help of Peter Wagenet on IRC), but none of them seem to work.

I would like to make slug my primary key on my model, and also since I'm working with MongoDB, I would like to use _id instead of id.

Has anyone figured out how to do this? My underlying problem is that model records get loaded twice when I do several App.MyModel.find() on the model.

like image 965
Benjamin Netter Avatar asked Feb 11 '13 22:02

Benjamin Netter


3 Answers

As of Ember Data 1.0 beta you define primaryKey on the respective serializer.

For the entire app

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

For a single type

App.FooSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

You will still refer to it as id on the model, but Ember Data will serialize/deserialize it to _id during transfer.

Example: http://emberjs.jsbin.com/OxIDiVU/635/edit

Read More about it here: http://emberjs.com/api/data/classes/DS.RESTSerializer.html#property_primaryKey

like image 62
Kingpin2k Avatar answered Oct 23 '22 22:10

Kingpin2k


I would like to make slug my primary key on my model, and also since I'm working with MongoDB, I would like to use _id instead of id.

Use the adapter's map API to specify the attribute that should be used as primary key:

App.Adapter.map('App.Person', {
  primaryKey: '_id'
});

See serializer.js api docs for detail. If you need to further customize how the records id is serialized, use the addId hook described here.

Since ember-data is still under active development, documentation on this feature is somewhat limited and may change before 1.0 release. In the meantime refer to the ember-data test suite to see examples of this in action. For example:

  • mapped primary keys are respected when serializing a record to JSON demonstrates how an _id attribute will be included in json when a record is saved
  • mapped primary keys are respected when materializing a record from JSON shows how JSON with _id attribute will be transformed into a record with the correct id
like image 3
Mike Grassotti Avatar answered Oct 23 '22 20:10

Mike Grassotti


In case the solution suggested by Nikita doesn't work (didn't for me using revision 11 of ember-data), here is how I changed the primary key when working with the 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...
    }
});

I'm aware that this probably won't help the OP anmore but I still post it as it may be helpful for some of you.

like image 1
iStefo Avatar answered Oct 23 '22 21:10

iStefo