Ember Data で hasMany な関連をフェッチせずにカウントする

ブログアプリで post has many comments な関連があるとします。記事の一覧にそれぞれコメントの件数を出すにはどうしたらよいでしょうか。

<ul>
  {{#each posts as |post|}}
    <li>
      {{link-to post.title 'post' post}}
      (コメント: {{post.comments.length}}件)
    </li>
  {{/each}}
</ul>

これで意図通り動きはするのですが、post.comments.length が評価されたタイミングですべてのコメントがフェッチされてしまいます。動作が遅くなってしまうので、記事を開くまでコメントの実体はロードしたくありません。

このようなケースを扱うため、Ember Data 2.5 で References(参照)という API が導入されました。
Ember.js - Ember Data 2.5 and 2.6 Beta Released

DS.Model#hasMany で関連の参照を取得できます(関連を定義する DS.hasMany とは別物です)。ここから id の配列を取り出せますので、これをカウントしてやれば件数がわかります。

// app/models/post.js

import Model from 'ember-data/model';
import { hasMany } from 'ember-data/relationships';
import computed from 'ember-computed';

export default Model.extend({
  comments: hasMany('comment'),

  numComments: computed('comments.length', function() {
    const commentsRef = this.hasMany('comments');

    return commentsRef.ids().length;
  })
});
<ul>
  {{#each posts as |post|}}
    <li>
      {{link-to post.title 'post' post}}
      (コメント: {{post.numComments}}件)
    </li>
  {{/each}}
</ul>

この機能は emberjs/rfcs#57 で提案され、emberjs/data#3303 で実装されました。当時のやり取りに興味があれば眺めてみると面白いでしょう。