我有两个模型,User
有很多Messages
:
App.Router.map(function() {
this.resource('user', { path: ':user_id' }, function () {
this.route('profile', { path: 'profile' });
this.resource('messages');
});
});
App.User = DS.Model.extend({
displayName: DS.attr('string'),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
location: DS.attr('string'),
messages: DS.hasMany('message')
});
App.Message = DS.Model.extend({
user: DS.belongsTo('user'),
createdAt: DS.attr('date'),
updatedAt: DS.attr('date'),
fullText: DS.attr('string'),
subject: DS.attr('string'),
recipients: DS.attr('string')
});
目前,我必须在搜索用户时加载整个模型,包括与用户关联的所有消息。
我想做的是:
我无法在Ember找到一个简单的方法。我最好的猜测是在路线中呼叫find
,可能是:
App.UserRoute = Ember.Route.extend({
model: function (params) {
var user = this.store.find('user', params.user_id);
this.store.find('message', { user: 3 });
return user;
}
}
但这会生成网址/messages?user_id=3
。我想要的是/users/3/messages
。
如何查询与用户关联的消息?
答案 0 :(得分:1)
我认为{ async: true }
正是您所寻找的。有关它是什么以及如何使用它的讨论,请参见http://discuss.emberjs.com/t/what-is-an-async-relationship-async-true-vs-async-false/4107。
您可能希望像这样设置模型:
App.User = DS.Model.extend({
displayName: DS.attr('string'),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
location: DS.attr('string'),
messages: DS.hasMany('message', { async: true } )
});
然后当您的Handlebars模板发出{{myUser.messages}}
请求时(或{{myUser.messages.someProperty}}
Ember数据会查看User
模型,并注意消息ID(例如,5,10,然后,它将在本地数据存储区中查找消息5,10和12.如果有它们,它将显示它们。如果它们不存在,它将使用您为{定义的适配器{ {1}}(或者,如果没有定义适配器,则使用HTTP GET来获取默认值Message
)。
我相信它会为每个id提出一个请求(而不是一个请求),但这是我不能100%肯定的。