Последнее обновление навсегда : я не могу продолжать обновлять это. Так что это устарело и, скорее всего, будет таким. вот лучшая и более современная ветка EmberJS: Как загрузить несколько моделей по одному и тому же маршруту?
Обновление: в моем первоначальном ответе я сказал использовать embedded: trueв определении модели. Это неверно. В версии 12 Ember-Data ожидает, что внешние ключи будут определены с суффиксом ( ссылкой ) _idдля отдельной записи или _idsдля коллекции. Что-то похожее на следующее:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Я обновил скрипку и сделаю это снова, если что-то изменится или если я обнаружу больше проблем с кодом, приведенным в этом ответе.
Ответ со связанными моделями:
Для сценария вы описываете, я бы полагаться на ассоциации между моделями (настройки embedded: true) и только загрузить Postмодель в этом маршруте, учитывая , что я могу определить DS.hasManyассоциацию для Commentмодели и DS.belongsToассоциации для Userв обоих Commentи Postмоделях. Что-то вроде этого:
App.User = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
email: DS.attr('string'),
posts: DS.hasMany('App.Post'),
comments: DS.hasMany('App.Comment')
});
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
author: DS.belongsTo('App.User'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
body: DS.attr('string'),
post: DS.belongsTo('App.Post'),
author: DS.belongsTo('App.User')
});
Это определение даст примерно следующее:

Благодаря этому определению, всякий раз, когда я findпишу сообщение, я буду иметь доступ к коллекции комментариев, связанных с этим сообщением, а также к автору комментария и пользователю, который является автором сообщения, поскольку все они встроены . Маршрут остается простым:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Таким образом, в PostRoute(или PostsPostRouteесли вы используете resource) мои шаблоны будут иметь доступ к контроллеру content, который является Postмоделью, поэтому я могу ссылаться на автора просто какauthor
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{author.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(см. скрипку )
Ответ с не связанными моделями:
Однако, если ваш сценарий немного сложнее того, что вы описали, и / или вам необходимо использовать (или запрашивать) разные модели для определенного маршрута, я бы рекомендовал сделать это в Route#setupController. Например:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
setupController: function(controller, model) {
controller.set('content', model);
controller.set('user', App.User.find(window.user_id));
}
});
И теперь, когда я нахожусь на маршруте Post, мои шаблоны будут иметь доступ к userсвойству в контроллере, как это было настроено в setupControllerхуке:
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{controller.user.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(см. скрипку )