Using primary keys with Ember Data

后端 未结 5 1528
情歌与酒
情歌与酒 2020-12-14 04:10

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

相关标签:
5条回答
  • 2020-12-14 04:22

    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
    0 讨论(0)
  • 2020-12-14 04:22

    Try to extend your adapter like this:

       App.RESTSerializer = DS.RESTSerializer.extend({
          init: function() {
            this._super();
    
            this.map('App.MyModel', {
              primaryKey: "_id"
            });
          }
        });
    
    0 讨论(0)
  • 2020-12-14 04:26

    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.

    0 讨论(0)
  • 2020-12-14 04:30

    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

    0 讨论(0)
  • 2020-12-14 04:41

    I use MongoDB and Ember-Data 1.0.0-beta.6 in my application and the _id posed a problem in Ember 1.4.0 for me too. Here's what I've done to solve the problem, assuming the returned JSON array is nested in the root property "people":

    App.ApplicationSerializer = DS.RESTSerializer.extend({
        normalizeHash: {
            people: function(hash) {
                hash.id = hash._id;
                delete hash._id;
                return hash;
            }
        }
    });
    

    This is, of course, an application-wide serializer but you can limit it to a specific path with something like App.MyPathSerializer = DS.RESTSerializer.extend({ ... });

    0 讨论(0)
提交回复
热议问题