2013-05-05 107 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