2013-09-26 4 views
4

Мой сервер возвращает ответ JSON, как это:Ember псевдоним модель данных/Карта JSON ответ

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

«художник» фактически модель пользователя, но с другим именем. Как я могу сопоставить художника с моделью пользователя? Может быть, это плохое объяснение, но если я переименую сервер JSON-serveride на «пользователей», а не на «художник», и использовать модели ниже, все работает так, как я хочу. Я просто хочу использовать имя «artist» вместо «user», как на стороне сервера, так и на стороне клиента. Надеюсь, вы понимаете, что я имею в виду.

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' 

Я думаю, что проще всего сделать было бы что-то вроде художников: «App.User» DS.hasMany, но очевидно, что это не работает.

+0

Вы могли бы попытаться сериализовать данные. http://ember-website.thomasboyt.com/api/data/modules/data-serializer.html – gearsdigital

+0

Я тоже думал об этом, но не понимаю, как это сделать? –

+0

У меня нет опыта работы с ember, но посмотрите здесь: https://gist.github.com/anonymous/6718391 'payload' должен содержать ваши данные ответа сервера. – gearsdigital

ответ

6

Во-первых, я рекомендую использовать последнюю Ember/EmberData, поэтому отношения определяются следующим образом:

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') 
}); 

Далее я рекомендую использовать ActiveModelAdapter, если вы получаете подчеркивания в ответе JSON:

App.ApplicationAdapter = DS.ActiveModelAdapter; 

Наконец, перекрывая typeForRoot и keyForRelationship в пользовательском сериализаторе должен устранить проблему:

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

Одна последняя вещь: вы можете даже избавиться от обычая keyForRelationship если имя отношения artists в Studio:

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

Спасибо, очень хороший ответ! К сожалению, я должен использовать Ember Data 0.13 из-за ember auth. Но я соглашусь с этим ответом, потому что похоже, что это сработает, когда я смогу начать использовать последнюю версию Ember Data. –

3

Вы пробовали только создать модель Artist, расширенную от Пользователя?

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

Я не пробовал, но подозреваю, что это может сработать.

Смежные вопросы