私のemberルーターには、このタイプの親/子リソースが設定されています。
this.resource("cities", function(){
this.resource("city", { path: ':city_id'});
});
バックエンド (Rails) では、City.rb と Restaurant.rb の間に has_many 関係があり、City の Active Model Serializer (AMS) では、Restaurant との has_many 関係も宣言しています。AMS では、関係を宣言するときに、次のようなことを行うオプションが提供されます
embed :ids, include: true
子モデル (私の場合はレストラン) の「id」のみが含まれるようにします。私はそれをしませんでした。したがって、City.rb モデルで findAll ajax リクエストを実行すると、各都市のレストラン属性がすべて取得されます。つまり、都市テンプレートでは、すべてのレストラン データが手元にあるため、各レストランの名前などを表示できます。
<script type="text/x-handlebars" id="city">
{{ model.name }}//city name
{{#each item in model.restaurants}}
<li>
{{#link-to 'restaurant' item}}{{ item.name }}{{/link-to}}
</li>
{{/each}}
</script>
ただし、実際には子モデル (私の場合はレストラン) の id のみを埋め込むことが Ember のベスト プラクティスであることを読みました embed :ids, include: true
。つまり、レストラン名は上記のテンプレートでは使用できません。
私の質問は、私がそうするembed :ids, include: true
場合、各都市のテンプレートを表示しているときに、id
プレゼントだけを持っていて何の役に立つのでしょうか? つまり、各都市のレストランのリストを表示することはできませんでした。それらを表示したい場合は、都市ごとに個別にクエリを実行する必要があります。
embed :ids, include: true
それが正しければ、アクティブ モデル シリアライザーで Emberを使用するユース ケースは何ですか。コードをより効率的にするために、このコンテキストでそれを使用する方法はありますか?
コード
私の街のfindAllメソッド
App.City.reopenClass({
findAll: function() {
return $.getJSON("cities").then(
function(response) {
console.log(response);
var links = Em.A();
response.cities.map(function (attrs) {
links.pushObject(App.City.create(attrs));
});
console.log(links);
return links;
}
);
},
});
都市のテンプレート
<script type="text/x-handlebars" id="cities">
<div class='span4'>
{{#each item in model}}
<li> {{#link-to 'city' item}}
{{ item.name }}
{{/link-to }}</li>
{{/each}}
</ul>
</div>
<div class="span4 offset4">
{{ outlet}}
</div>
</script>
レストランも表示されている都市テンプレート
<script type="text/x-handlebars" id="city">
{{ model.name }} //city name
{{#each item in model.restaurants}}
<li>
{{#link-to 'restaurant' item}}{{ item.name }}{{/link-to}}
</li>
{{/each}}
</script>