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: [...]没有_ids后缀的情况下被序列化(请参阅Ember.js 指南的 REST 适配器部分的关系子部分)。

我尝试了以下解决方法:

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

看来这个提交是造成这种情况的原因。当 AMS 更新为将has_one关联序列化为association_id(使 AMS 符合 ember-data)时,它也被修改为将belongs_to关联序列化为association_ids.

于 2013-02-01T04:42:18.937 回答