user3568719
user3568719

Reputation: 1056

Embedded data from RestApi

My data comes from REST API like this:

customers:[
    id:3,
    name:"Joue",
    currency:{
        id:5
        iso_code:"BDT"
    }

]

My model:

App.Customer = DS.Model.extend({
        name: DS.attr('string'),
        currency: DS.attr('string')

});

i populated a select box with the availabe currencies and now i want to select by "id" 5. Since currency is embedded and its interpreted as string i cant access it. As far as i know embedded records are no longer supported in ember-data 1.0.

do i have to rewrite my REST Api and get rid of the relationships or there is a workaround .

Upvotes: 1

Views: 105

Answers (2)

user663031
user663031

Reputation:

currency is not "embedded", it's just an object. Don't declare it as a string in your model:

currency: DS.attr()

You say you want to "select" by id--what do you actually want to do? You can access the properties of currency directly:

{{! handlebars }}
Your currency id is {{currency.id}}.

// Javascript
id = model.get('currency.id');

No need for additional complexity involving serializers or additional models. However, you need to be careful when changing currency id, since

model.set('currency.id', 6)

will not dirty the model and it won't save. You'll need to also incant

model.notifyPropertyChange('currency')

Upvotes: 0

Kingpin2k
Kingpin2k

Reputation: 47367

You can just create a custom serializer for the data.

Using your data (slightly modified, since the json isn't valid, and I'm guessing that's just cause it was hand written?)

{
    customers:[
     {
      id:3,
      name:"Joue",
      currency:{
        id:5,
        iso_code:"BDT"
      }
    }
   ]
}

Here's a serializer for that particular response type (read more about it here https://github.com/emberjs/data/blob/master/TRANSITION.md)

App.CustomerSerializer = DS.RESTSerializer.extend({
  extractArray: function(store, type, payload, id, requestType) {
    var customers = payload.customers,
        currencies = [];

    customers.forEach(function(cust) {
      var currency = cust.currency;
      delete cust.currency;
      if(currency){
        currencies.push(currency);
        cust.currency = currency.id;
      }
    });

    payload = { customers:customers, currencies: currencies };

    return this._super(store, type, payload, id, requestType);
  }
});

And your models defined with a relationship

App.Customer = DS.Model.extend({
    name: DS.attr('string'),
    currency: DS.belongsTo('currency')
});

App.Currency = DS.Model.extend({
    iso_code: DS.attr('string')
});

Example:

http://emberjs.jsbin.com/OxIDiVU/535/edit

Upvotes: 1

Related Questions