我使用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')
我对没有加载的模型有hasMany
和belongsTo
关系。关系的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如何开箱即用。那么也许它应该被添加?
答案 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`后,可能有人遇到类似问题