Вариант использования Active Model Serializer `embed :ids, include: true` с Ember

В моем Ember-маршрутизаторе настроен этот тип родительского/дочернего ресурса.

 this.resource("cities", function(){
         this.resource("city", { path: ':city_id'});

    });

В бэкенде (то есть Rails) существует связь has_many между City.rb и Restaurant.rb, а в Active Model Serializer (AMS) для City я также объявляю связь has_many с Restaurants. В AMS при объявлении отношений вы можете сделать что-то вроде этого

embed :ids, include: true

так что включены только «идентификаторы» дочерней модели (в моем случае ресторана). Я не этого не делал. Поэтому я получаю все атрибуты ресторана для каждого города, когда делаю ajax-запрос findAll для модели City.rb. Это означает, что в шаблоне города я могу отобразить название каждого ресторана и т. д., потому что все данные о ресторане находятся под рукой.

 <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 рекомендуется вставлять идентификаторы только для дочерних моделей (в моем случае ресторана) embed :ids, include: true, что означает, что название ресторана не будет доступно в приведенном выше шаблоне.

Мой вопрос заключается в следующем: если я делаю embed :ids, include: true, когда я показываю шаблон для каждого города, какой смысл иметь только id? Это означает, что я не мог отобразить список ресторанов для каждого города, а если бы я хотел их показать, мне пришлось бы запрашивать отдельно для каждого города.

Если это так, каков вариант использования embed :ids, include: true в Active Model Serializer с 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>

Шаблон 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>

person BrainLikeADullPencil    schedule 12.09.2013    source источник


Ответы (2)


Я считаю, что embed: ids обычно используется, когда вы используете Ember Data. После настройки отношений модели в ED он сможет просмотреть массив идентификаторов, которые вы предоставили для отношения, и загрузить их для шаблона, где эти данные необходимы.

Ознакомьтесь с документами по модели (ED) Embers для получения дополнительной информации.

person John    schedule 13.09.2013

Читая документ AMS здесь о встроенных ассоциациях, похоже, что используется embed: ids, include: true side- загружает данные вместе с загружаемыми объектами.

Это означает, что в вашем случае вы получите что-то вроде:

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,

Это упрощает обработку всего пакета данных без необходимости рекурсивного сканирования дерева в поисках встроенной информации.

Одним из вариантов использования этой конфигурации является использование ActiveModelAdapter для данных Ember, требует embed: ids, include: true для правильной работы.

person TMSCH    schedule 18.06.2014