0

私の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>
4

2 に答える 2