Search code examples
ember.jsember-data

Load a model manually with EmberData


I have an Ember app with a login form which returns the current user in JSON format after successful login.

Using createRecord sets the returned JSON attributes directly on the model. For instance, is_private becomes user.is_private, not user.get('isPrivate')?

How do I load the user model so that the attributes are set correctly and I don't have to re-fetch it using the id?


Solution

  • Supposedly, the official way to do this is using adapter.load, as described in this thread:

    Loading Data

    Previously, some features of the store, such as load(), assumed a single adapter.

    If you want to load data from your backend without the application asking for it (for example, through a WebSockets stream), use this API:

    store.adapterForType(App.Person).load(store, App.Person, payload);

    This API will also handle sideloaded and embedded data. We plan to add a more convenient version of this API in the future.

    But unfortunately, it doesn't handle sideloaded data, despite what the documentation claims. I personally use something like the following, which is based on how find(ID) is implemented:

    var id = json["person"]["id"];
    var store = DS.get("defaultStore");
    var adapter = store.adapterForType(App.Person);
    adapter.didFindRecord(store, App.Person, json, id);
    var person = App.Person.find(id);
    

    Note that this code assumes JSON in the same format that find(ID) expects to receive from the server, as documented in the RESTAdapter guide:

    {
      person: {
        id: 1,
        is_private: false,
        projects: [3]
      },
      projects: [
        { id: 3, name: "FooReader" }
      ]
    }
    

    This will apply any transformations you've configured using keyForAttributeName (such as mapping is_private to isPrivate), and it will handle sideloaded records. I'm not sure if this is a best practice, but it works quite well.