EmberJS Data使用ActiveModelSerializers进行多次侧载

时间:2014-05-23 07:55:52

标签: ember-data active-model-serializers

我使用Ember Data canary build:1.0.0-beta.8+canary.267214b9以及rails后端和ActiveModelSerializer。我在ember端的配置如下所示:

App.ApplicationSerializer = DS.ActiveModelSerializer.extend()

App.ApplicationAdapter = DS.ActiveModelAdapter.extend
  namespace: "api/v1"

App.Authentication = DS.Model.extend
  provider: DS.attr('string')
  user: DS.belongsTo('user')

App.User = DS.Model.extend
  username: DS.attr('string')
  email: DS.attr('string')
  authentications: DS.hasMany('authentication')

我对没有加载的模型有hasManybelongsTo关系。关系的JSON如下所示:

 {
   objectA: {
     property1: 'prop1',
     property2: 'prop2',
     objectB_ids: ['1','2']
   }
 }

目前我尝试使用多个身份验证的用户模型来工作。但是那里的认证应该是侧面加载的。它不适用于以下JSON:

JSON - 无法正常工作

{
  authentications: [{ id:1, provider:"google" }],
  user: {
    id: '1',
    username: 'max',
    email: 'max@examle.com',
    authentication_ids:[1],
  }
}

但它确实有用:

JSON - 正在运作

{
  authentications: [{ id:1, provider:"google" }],
  user: {
    id: '1',
    username: 'max',
    email: 'max@examle.com',
    authentications:[1],
  }
}

我在网上找到的唯一有用的信息是这个问题:

Serialising async hasMany relationships

这是DS.ActiveModelSerializer中的错误还是我错过了一些配置?

编辑1:

DS.ActiveModelSerializer的文档中,您可以找到以下内容:

  

它被设计为使用activemodelserializers Ruby gem开箱即用。

具有authentication_ids:[...]的版本就是这样,ActiveModelSerializers Ruby gem如何开箱即用。那么也许它应该被添加?

2 个答案:

答案 0 :(得分:1)

我认为你混淆了ActiveModelSerializer与Ember Data的其他约定所做的事情。你工作的第二个例子是正确的。 This section描述了JSON布局的当前期望。 _ids不存在。

{
  "post": {
    "id": 1,
    "title": "Rails is omakase",
    "comments": ["1", "2"],
    "user" : "dhh"
  },

  "comments": [{
    "id": "1",
    "body": "Rails is unagi"
  }, {
    "id": "2",
    "body": "Omakase O_o"
  }]
}

ActiveModelSerializer适配器允许您传递JSON中的下划线键而不是camelcased键。例如,如果您的用户有一个camelcased名称:

App.User = DS.Model.extend
  firstName: DS.attr()

您的JSON应如下所示:

{
  "user": {
    "first_name": "kunerd"
  }
}

答案 1 :(得分:0)

解决了我的问题,DS.ActiveModelSerializer按预期工作,并为侧载模型接受了_ids数组。

我的问题是,我用{I}覆盖了App.UserSerializer

 App.UserSerializer = DS.RESTSerializer.extend
   # some custom logic

,但必须是:

 App.UserSerializer = App.ApplicationSerializer.extend
   # some custom logic

DS.RESTSerializer更改为DS.ActiveModelSerializer`后,可能有人遇到类似问题