通过自定义primaryKey查找记录

时间:2013-05-05 21:01:49

标签: ember.js ember-data

我的模型定义如下:

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数据自定义主键时我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为您的问题在于您要定义username两次。如果你通过你的适配器将你的json中的username映射到你的模型的primaryKey,那么你应该避免在我猜的模型上做同样的事情。有不同的方法来定义映射,但适配器是最合适的位置在您的情况下,请参阅此处了解更多详细信息: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"});

然后按照你已经做过的id找到记录:

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

console.log( r.serialize() );

至少应该给你:

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

希望有所帮助