我的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
因此只包含儿童模特(在我的情况下,餐厅)的'ids'。我做了不那样做。因此,当我在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>
但是,我已经读过Ember的最佳实践,实际上只为儿童模型嵌入了id(在我的情况下是餐馆)embed :ids, include: true
,这意味着上面的餐馆名称不可用模板。
我的问题是,如果我embed :ids, include: true
,当我显示每个城市的模板时,它只有id
存在才有用吗?这意味着我无法显示每个城市的餐馆列表,如果我想展示它们,我必须单独查询每个城市。
如果这是正确的,那么在带有Ember的Active Model Serializer中使用embed :ids, include: true
的用例是什么。有没有办法在这种情况下使用它来提高代码的效率?
代码
我的城市找到所有方法
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>
city 模板,该模板还显示了餐馆
<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>
答案 0 :(得分:1)
阅读关于嵌入式关联的AMS here的文档,看起来好像使用embed: ids, include: true
将数据加载到加载的对象旁边。
这意味着,在您的情况下,您将收到如下内容:
cities: [
{id: 1, name: 'Paris', restaurant_ids: [1, 3]},
{id: 2, name: 'Houston', restaurant_ids: [2]}
],
restaurants: [
{id: 1, name: 'Septime'},
{id: 2, name: 'Unknown restaurant'},
{id: 3, name: 'Le Reminet'}
]
因此,您应该能够在没有任何进一步请求的情况下获取餐馆数据,这与您最初描述的方式的唯一区别在于,餐馆数据不会直接嵌入城市数据中。
来自AMS doc,
这样可以更轻松地处理整个数据包,而无需递归扫描树以查找嵌入信息。
此配置的一个用例是使用ActiveModelAdapter进行Ember数据,这需要embed: ids, include: true
才能正常工作。
答案 1 :(得分:0)
我相信当您使用Ember数据时,通常会使用embed: ids
。在ED中设置模型关系后,它将能够查看您提供的id的数组与关系,并为需要该数据的模板加载它们。
查看余烬Model (ED) docs了解更多信息。