最終更新は永久に : これを更新し続けることはできません。したがって、これは推奨されておらず、おそらくこのようになります。これは、より優れた最新のスレッドEmberJS: How to load multiple models on the same route? です。
更新:embedded: true
元の回答では、モデル定義で使用すると言っていました。それは正しくありません。リビジョン 12 では、Ember-Data は外部キーが単一レコードまたはコレクションの接尾辞 ( link )で定義されることを想定しています。次のようなもの:_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);
},
// in this sample, "model" is an instance of "Post"
// coming from the model hook above
setupController: function(controller, model) {
controller.set('content', model);
// the "user_id" parameter can come from a global variable for example
// or you can implement in another way. This is generally where you
// setup your controller properties and models, or even other models
// that can be used in your route's template
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>
(フィドルを参照)