2013-09-26 4 views
4

Mon serveur renvoie une réponse JSON comme ceci:modèle d'alias de données Ember/Carte réponse JSON

{ 
    artists: [{ 
    id: "1", 
    first_name: "Foo", 
    last_name: "Bar" 
}], 
    studios: [{ 
    id: 1, 
    name: "Test", 
    // ... 
    artist_ids: ["1"] 
    }] 
} 

« artiste » est en fait un modèle de l'utilisateur, mais avec un autre nom. Comment puis-je mapper un artiste au modèle User? Peut-être une mauvaise explication, mais si je renommer la réponse JSON côté serveur à 'utilisateurs' au lieu de 'artiste' et utiliser les modèles ci-dessous tout fonctionne comme je veux. Je veux simplement utiliser le nom 'artiste' au lieu de 'utilisateur', côté serveur et côté client. J'espère que vous comprenez ce que je veux dire.

App.Studio = DS.Model.extend 
    name: DS.attr 'string' 
    // .. 
    users: DS.hasMany 'App.User' 

App.User = DS.Model.extend 
    firstName: DS.attr 'string' 
    lastName: DS.attr 'string' 
    studio: DS.belongsTo 'App.Studio' 

Je suppose que la chose la plus simple à faire serait quelque chose comme artistes: DS.hasMany « App.User » mais il est évident que cela ne fonctionne pas.

+0

Vous pouvez essayer de sérialiser vos données. http://ember-website.thomasboyt.com/api/data/modules/data-serializer.html – gearsdigital

+0

J'y ai pensé aussi mais je ne comprends pas vraiment comment? –

+0

Je n'ai pas beaucoup d'expérience avec les braises, mais regardez ici: https://gist.github.com/anonymous/6718391 'payload' devrait contenir vos données de réponse du serveur. – gearsdigital

Répondre

6

D'abord, je vous recommande d'utiliser la dernière Ember/EmberData, si les relations sont définies comme suit:

App.Studio = DS.Model.extend({ 
    name: DS.attr('string'), 
    // .. 
    users: DS.hasMany('user') 
}); 

App.User = DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    studio: DS.belongsTo('studio') 
}); 

Ensuite, je recommande d'utiliser la ActiveModelAdapter si vous obtenez underscores dans votre réponse JSON:

App.ApplicationAdapter = DS.ActiveModelAdapter; 

Enfin, outrepassant typeForRoot et keyForRelationship dans un sérialiseur personnalisé devrait résoudre votre problème:

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({ 
    typeForRoot: function(root) { 
    if (root == 'artist' || root == 'artists') { root = 'user'; } 
    return this._super(root); 
    }, 

    keyForRelationship: function(key, kind) { 
    if (key == 'users') { key = 'artists'; } 
    return this._super(key, kind); 
    } 
}); 

Example JSBin

Une dernière chose: vous pouvez même vous débarrasser de la coutume keyForRelationship si vous nommez la relation artists dans Studio:

App.Studio = DS.Model.extend({ 
    name: DS.attr('string'), 
    // .. 
    artists: DS.hasMany('user') 
}); 
+0

Merci, très bonne réponse! Malheureusement, je dois utiliser Ember Data 0.13 en raison de l'authentification de l'ember. Mais j'accepterai cette réponse car il me semble que cela fonctionnera quand je pourrai commencer à utiliser la dernière version d'Ember Data. –

3

Avez-vous essayé de créer simplement un modèle Artist étendu à partir de User?

App.Artist = App.User.extend({}) 

Je ne l'ai pas essayé, mais je soupçonne que cela pourrait fonctionner.

Questions connexes