6

Ember-Data は設計上、Active Model Serializers と互換性があるはずですがhas_many、埋め込まれた ID との関係をシリアル化することについては歩調を合わせていないようです。

たとえば、シリアライザー

class PostSerializer < ActiveModel::Serializer
  embed :ids
  has_many :comments
end

JSONを生成します

{
    "post": {
        "comment_ids": [...]
    }
}

しかし、Ember Data のデフォルト設定では、

App.Post = DS.Model.extend({
  DS.hasMany('App.Comment'),
});

App.Comment = DS.Model.extend();

は、コメントの関連付けがサフィックスcomments: [...]なしでシリアル化されることを想定しています ( Ember.js ガイドの REST アダプター セクションの関係サブセクションを参照してください)。_ids

回避策として次のことを試しました。

class PostSerializer < ActiveModel::Serializer
  attribute :comments
  def comments
    object.comment_ids
  end
end

動作しますが、サイドローディングを有効にするために追加embed :ids, :include => trueしても、AMS はそれが関連付けであることを認識していないため、何もしません。

編集: active_model_serializers (0.6.0)gem と Ember-Data リビジョン 11を使用しています

4

4 に答える 4

7

ember-data 1.0.0-beta.3 の場合、私はこれを使用することになりました:

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({});

ここで説明されているように:移行ガイド

非常にうまく機能します!

于 2013-11-07T20:16:31.803 に答える
3

クライアント側のアダプターで適切なマッピングを構成してみることができます

DS.RESTAdapter.map('App.Post', { comments: { keyName: 'comment_ids' } });
于 2013-02-01T02:01:52.280 に答える
2

私は active_model_serializers 0.6.0 と ember_data 11 を使用しています。あなたが報告している動作は見られません。

私のシリアライザ:

class CentreSerializer < ActiveModel::Serializer
  embed :ids

  attributes :id, :name
  has_many :rooms
end

localhost:3000/centres/1.json の出力

{
  centre: {
    id: 1,
    name: "Centre0",
    rooms: [
      1,
      2,
      3,
      4,
      5
    ]
  }
}

私の場合、Rails アプリは、ember に到達する前に、正しく形成された json を生成しています。クライアント側でマッピングに頼る必要はありません。

于 2013-02-01T02:50:25.417 に答える
0

このコミットが原因のようです。has_oneとしてアソシエーションをシリアル化するように AMS が更新されたときassociation_id(AMS を ember-data に準拠させる)、belongs_toアソシエーションを としてシリアル化するようにも変更されましassociation_idsた。

于 2013-02-01T04:42:18.937 に答える