Active Model Serializer的使用案例`embed:ids,包括:带有Ember的true`

时间:2013-09-12 21:58:09

标签: ruby-on-rails ember.js active-model-serializers

我的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>

2 个答案:

答案 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了解更多信息。