我的 ember 路由器设置了这种类型的父/子资源。
this.resource("cities", function(){
this.resource("city", { path: ':city_id'});
});
在后端(即 Rails)中,City.rb 和 Restaurant.rb 之间存在 has_many 关系,在 City 的 Active Model Serializer (AMS) 中,我还声明了与 Restaurants 的 has_many 关系。在 AMS 中,当声明关系时,它为您提供了执行此类操作的选项
embed :ids, include: true
所以只包括子模型(在我的例子中是餐厅)的“id”。我没有那样做。因此,当我对 City.rb 模型执行 findAll ajax 请求时,我会获取每个城市的所有 Restaurant 属性。这意味着在城市模板中,我可以显示每家餐厅的名称等,因为所有餐厅数据都在手边
<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>
但是,我已经读到 Ember 中的最佳实践实际上只为儿童模型(在我的例子中是餐厅)嵌入 id embed :ids, include: true
,这意味着餐厅名称在上述模板中不可用。
我的问题是,如果我这样做embed :ids, include: true
,当我为每个城市显示模板时,只有现在有什么用id
?这意味着我无法显示每个城市的餐厅列表,如果我想显示它们,我必须单独查询每个城市。
如果这是正确的,那么embed :ids, include: true
在带有 Ember 的 Active Model Serializer 中使用的用例是什么。有没有办法在这种情况下使用它来提高代码效率?
代码
我的城市 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>