0

2 つの hasMany 子レコードを含む親レコードを読み込もうとしています。これが私のモデルです(ちなみに、最新のemberとember-dataのカナリアでember-app-kitを使用しています):

var Route = DS.Model.extend({
    name: DS.attr(),
    description: DS.attr(),
    creation: DS.attr(),
    modified: DS.attr(),
    active: DS.attr(),
    adhoc: DS.attr(),
    routeUsers: DS.hasMany('user'),
    userApprovals: DS.hasMany('userApproval')
});

export default Route;

var UserApproval = DS.Model.extend({
    user: DS.belongsTo('user'),
    amount: DS.attr(),
    approval: DS.attr(),
    comment: DS.attr(),
    denyRedirect: DS.belongsTo('user')
});

export default UserApproval;

var User = DS.Model.extend({
    firstname: DS.attr(),
    lastname: DS.attr(),
    username: DS.attr(),
    email: DS.attr(),

    fullName: function(){
        return this.get('firstname') + ' ' + this.get('lastname');
    }.property('firstname', 'lastname')
});

export default User;

mongodb インスタンスから返される JSON は次のとおりです。

{
  "route": {
    "name": "4",
    "description": "123",
    "adhoc": true,
    "_id": "527822dee56a06dc2a000002",
    "__v": 0,
    "user_approvals": [
      {
        "amount": "22",
        "user_id": "5277ca37b900b14c0e000003",
        "deny_redirect_id": "5277ca25b900b14c0e000002",
        "id": "f0ced142-aee1-4abb-f36a-56ae0088141b"
      }
    ],
    "route_users": [
      {
        "firstname": "first",
        "lastname": "last",
        "username": "flast",
        "email": "flast@xyz.com",
        "id": "5277ca37b900b14c0e000003"
      }
    ]
  }
}

これが私のルートシリアライザーです:

import ApplicationSerializer from 'appkit/serializers/application';

var RouteSerializer = ApplicationSerializer.extend({
    attrs: {
        routeUsers: {
            embedded: 'always'
        },
        userApprovals: {
            embedded: 'always'
        }
    }
});

export default RouteSerializer;

_id のアプリケーションシリアライザーで正規化を行っているため、ルートシリアライザーを拡張しています。これが、アプリケーション シリアライザーの唯一の変更点です。

私が抱えている問題は、ルート モデルが読み込まれてコントローラーに設定されたときに、hasMany 関係が存在しないことです。ember chrome 拡張機能とコンソールを使用してモデルを見ると、次のようになります。

adhoc: true
description: "something here"
id: "527948268a65b92022000001"
name: "14"
routeUserIds: Array[1]
 0: "5277ca25b900b14c0e000002"
 length: 1
 __proto__: Array[0]
routeUsers: undefined
userApprovalIds: Array[1]
 0: "017b4fe7-9f98-4bce-9c8d-089309b7729a"
 length: 1
 __proto__: Array[0]
userApprovals: undefined
v: 0
__proto__: Object

したがって、ルートがモデルに配置されていることはわかっています。名前や説明などをレンダリングできますが、hasMany リレーションには何もありません。hasMany リレーションにアクセスするにはどうすればよいですか? ストアを見ると、ペイロードの配信後に hasMany リレーションがストアにロードされていることがわかります。私はこれでextractSingleをオーバーライドしようとしました:

extractSingle: function(store, type, payload, id, requestType) {
        var userApprovals = payload.route.user_approvals,
            approvalIds = userApprovals.mapProperty('id');

        payload.user_approvals = userApprovals;
        payload.route.user_approvals = approvalIds;

        return this._super.apply(this, arguments);
    }

ただし、以前とまったく同じ結果がレンダリングされ、hasMany 情報は読み込まれず、id だけが表示されます。

私は過去数日間探していて、このPRを指摘されました:

https://github.com/emberjs/data/pull/1404

しかし、私はまだそれを機能させることができません。私は何かが欠けていると確信しています。おそらく他の目が必要なだけです。

ありがとう、ジャレッド

4

2 に答える 2

0

まず、attrs古いキーから新しいキーへの直接的な文字列から文字列へのマッピングであるため、現在の使用は無効です。

この正確な状況は、以下に引用する TRANSITION.md ドキュメントで詳細に説明されています。

{
  "post": {
    "id": "1",
    "title": "Rails is omakase",
    "comments": [{
      "id": "1",
      "body": "I like omakase"
    }, {
      "id": "2",
      "body": "I prefer not to rely on elitist chefs"
    }]
  }
}

次のように埋め込みレコードを処理できます。

App.PostSerializer = DS.RESTSerializer.extend({
  extractSingle: function(store, type, payload, id, requestType) {
    var comments = payload.post.comments,
        commentIds = comments.mapProperty('id');

    payload.comments = comments;
    payload.post.comments = commentIds;

    return this._super.apply(this, arguments);
  }
});
于 2013-11-25T16:51:02.813 に答える