2013-05-05 209 views
0

我的模型定義如下:查找記錄

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} 

但它回退一個「空」對象。還測試過:

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

但是這是在做一個遠程請求。我讀過Ember Data允許您通過ID以外的屬性查找記錄。

那麼我在告訴Ember數據我做錯了我的定製primaryKey

回答

0

我認爲你的問題在於你定義了兩次username。如果你從你的json映射username到你的模型的primaryKey通過你的Adapter,那麼你應該避免在我猜的模型上做同樣的事情。有哪裏定義映射不同的方法,但該適配器是最合適的地方在你的情況,在這裏看到更多的細節:https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#mapping

改變你的代碼就像這樣,它應該工作:

​​

現在嘗試創建一個新的記錄

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

,然後查找記錄通過它的id,你已經做了:

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 2013-05-06 21:44:57

+0

你應該使用'FixturesAdapter',因爲'RESTAdapter'是爲了處理請求,所以它只有在'RESTAdapter'上定義了find()和所有這樣的方法時才起作用。說得通? – intuitivepixel 2013-05-07 18:21:46

+0

請參閱此鏈接:https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#revision-12。什麼意思「自定義sideloadAs和**鍵映射**仍然可以配置爲根據需要覆蓋這些默認值」? **鍵映射**代表什麼?他們在談論主鍵?謝謝 – Mattia 2013-05-09 19:42:23