搜索Ember数据异步hasMany id而不加载所有id记录

时间:2014-10-22 22:04:03

标签: javascript ruby-on-rails ember.js ember-data

我正在尝试搜索特定记录的数千条记录。我已经加载了一个用户模型,它有几千个异步发货。换句话说,我让序列化程序向下发送shipment_ids用户模型。

App.User = DS.Model.extend({
  shipments: DS.hasMany('shipment', { async: true })
});

我想搜索所有这些ID,以查看特定记录的ID是否在其中。但是我不想去api并加载每一条记录。我只是希望能够搜索shipment_ids

I have a jsbin展示它加载所有记录。如何更改此设置,以便它不会对货件进行任何api调用,仍然可以找到特定记录?

而不是做

this.get('shipments').any(function(shipment){
  return shipment.get('id') === "10124";

必须有办法只通过ID,不是吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

这个黑客非常臭,但这是我找到的唯一方法。它是使用_data

进行搜索
this.get('content._data.shipments').any(function(shipment){
  return shipment.get('id') === "10124";
});

它不会进行任何api通话。但是,在更新Ember时,必须有一种更容易接受的方法,不容易破损。

Here is an updated jsbin来表明这一点。有没有人有更好的解决方案?

谢谢!

答案 1 :(得分:2)

Get belongsTo ID without fetching record”中描述的解决方案  似乎从Ember Data 1.0.0-beta.10开始工作。简而言之,您可以执行以下操作来访问基础

modelInstance.get('data.belongsToRelation.id');

据推测,你也可以这样做(虽然我没有测试过):

modelInstance.get('data.hasManyRelation');

原始答案(不要使用):

  

我通过为id添加第二个模型字段在belongsTo上完成了此操作。我的例子:

     

App.User = DS.Model.extend({        group:DS.belongsTo('group',{async:true}),        groupId:DS.attr('number')      });

     

所以也许你可以这样做?

     

App.User = DS.Model.extend({       货件:DS.hasMany('shipping',{async:true}),       shipmentIds:DS.attr('array')     });

     

你需要在app / transforms / array.js中添加一个数组变换(假设你使用了ember-cli)

     

从'ember-data'导入DS;

     

var ArrayTransform = DS.Transform.extend({         反序列化:function(序列化){             返回序列化;         },         serialize:function(反序列化){             返回反序列化;         }     });

     

导出默认的ArrayTransform;

     

让我知道它是否有效,因为我可能很快会在我的应用中需要类似的东西。

答案 2 :(得分:2)

自Ember Data 2.3起,您可以使用此代码:

// get all ids without triggering a request
var commentIds = post.hasMany('comments').ids();

有关详细信息,请参阅http://emberjs.com/blog/2016/01/12/ember-data-2-3-released.html