2013-05-05 3 views
0

Моя модель определяется следующим образом:Finding запись нестандартного PrimaryKey

App.User = DS.Model.extend({ 
    primaryKey: 'username', 
    username: DS.attr('string'), 
    name: DS.attr('string') 
}); 

Моей карта пользовательского адаптера:

DS.SocketAdapter.map('App.User', { 
    primaryKey: 'username', 
    username: DS.attr('string'), 
}); 

Я проверяю эту модель путем печатать на консоли:

App.User.createRecord({username:"user_1"}); 
var r = App.User.find("user_1"); 
console.log(r.serialize()); 

>> Object {username: null, name: null ..... all null} 

Но он перенастраивает объект «null». Также проверено:

App.User.find({username:"user_1"}); 

Но это делает удаленный запрос. Я читал, что Ember Data позволяет вам находить записи через атрибуты, отличные от ID.

Итак, что я делаю неправильно в передаче данных Ember мой пользовательский primaryKey?

ответ

0

Я думаю, что ваша проблема заключается в том, что вы определяете username дважды. если вы нанесете username с вашего json на основной код вашей модели через ваш адаптер, то вам следует избегать делать то же самое на модели, я думаю. Существуют различные подходы, где определяют отображение, но адаптер является наиболее подходящим местом в вашем случае, смотрите здесь для более подробной информации: https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#mapping

изменить ваш код так и он должен работать:

// Model 
App.User = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

// Adapter 
DS.SocketAdapter.map('App.User', { 
    primaryKey: 'username' 
}); 

Теперь попробуйте создать новую запись

App.User.createRecord({username:"user_1", name:"foo"}); 

, а затем найти запись по его идентификатор, как вы уже сделали:

var r = App.User.find("user_1"); 

это

console.log(r.serialize()); 

должен затем дать вам по крайней мере:

>> Object {name: "foo" ...} 

надеюсь, что это помогает

+0

Спасибо за ответ! Я не могу его заархивировать! Я создал jbin. http://jsbin.com/olizir/3/edit. Вот результат: http://jsbin.com/olizir/3. В моем реальном коде я не реализую метод find() моего адаптера (потому что меня не интересуют удаленные запросы, только поиск записи по ID). Спасибо – Mattia

+0

, вы должны использовать 'FixturesAdapter', потому что' RESTAdapter' предназначен для запросов, поэтому он работает только в том случае, если есть find() и все такие методы, определенные в 'RESTAdapter'. имеет смысл? – intuitivepixel

+0

Обратитесь по этой ссылке: https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#revision-12. Что означает, что «Пользовательские сопоставления с боковой загрузкой и **) все еще могут быть настроены для переопределения этих значений по умолчанию»? Что означает ** обозначение клавиш **? Они говорят о первичных ключах? благодаря – Mattia

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