我成功使用了Ember Data的DS.RESTAdapter
。该适配器有一个名为findMany
的方法。
只要访问某个模型实例的hasMany
关系,就会在幕后使用该方法:findMany
获取关系中已存在的一组裸ID以查询远程服务器所有这些ID的完整数据in one bulk AJAX request-response。
在我的Ember应用中,我现在需要查询一组ID 手动。应用程序从任何其他地方获取这些ID,在任何Ember Data模型实例的关系之外。
如果有助于可视化此要求,请想象一个用户输入以逗号分隔的ID列表,让Ember Data通过查询远程服务器来查找这些ID,然后使用Ember Data添加返回的数据某些模型实例的关系。
因此:如何批量查询一组ID,最好是利用DS.RESTAdapter.findMany
,然后将返回的Ember数据实例添加到某个模型实例的关系中?
TL; DR :我正在寻找类似App.MyModelType.**findMany**(234, 583, 234)
的内容,但我不想循环App.MyModelType.find
,因为这对大型网站来说效率不高ID数量。
答案 0 :(得分:0)
对于2013-06-25之前约会的Ember Data版本,在定义任何Ember Data模型类之前,将以下代码添加到app.js
:
DS.Model.reopenClass({
findMany: function(ids) {
//taken from model.js's storeAlias(..)
var store = Ember.get(DS, 'defaultStore'),
args = [].slice.call(arguments);
args.unshift(this);
Ember.assert("Your application does not have a 'Store' property defined. Attempts to call 'findMany' on model classes will fail. Please provide one as with 'YourAppName.Store = DS.Store.extend()'", !!store);
return store["findMany"].apply(store, args);
}
});
//begin definition of App.MyModelType = DS.Model.extend({..}); here
store.findMany(..)
将确定哪些ID尚未在商店中加载记录。
对于这些已卸载的记录,store.findMany(..)
会调用store.fetchMany(..)
store.fetchMany(..)
将使用adapter.findMany(..)
将查找逻辑委派给已使用的DS.Adapter
实现。
如果findMany
超出DS.Model
超类型,您现在可以使用App.MyModelType.findMany(..)
并返回一组模型实例,例如
var someArrayWithIds = [1, 2, 3];
someModelInstances = App.MyModelType.findMany(someArrayWithIds);