emberdata和mongodb嵌入对象ID未定义

时间:2012-07-31 08:15:36

标签: mongodb ember.js ember-data

我有关于Ember数据和Mongodb嵌入对象的问题。这是我的模特:

App.Contact = App.Entity.extend({
    name             : DS.attr('string'),
    firstname        : DS.attr('string'),
    additional_names : DS.attr('string'),
    civility         : DS.attr('string'),
    birthday         : DS.attr('date'),
    organization     : DS.belongsTo('App.Organization'),
    role             : DS.attr('string'),
    photo_source     : DS.attr('string'),
    photo_uri        : DS.attr('string'),
    gravatar_mail    : DS.attr('string'),
    addresses        : DS.hasMany('App.Address', { embedded: true }),
    emails           : DS.hasMany('App.Email', { embedded: true }),
    phones           : DS.hasMany('App.Phone', { embedded: true })
});

现在我通过API获取联系人:(GET / app / api / v1 / contact / 4f86c4774ab63c2417000001 /)这里是我得到的:

{
    "additional_names": null,
    "addresses": [],
    "birthday": null,
    "civility": null,
    "emails": [
        {
            "email": "alexandre@test.com",
            "label": null,
            "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
            "type": "HOME"
        }
    ],
    "firstname": "Alexandre",
    "gravatar_mail": null,
    "groups": [],
    "id": "4f86c4774ab63c2417000001",
    "name": "Simoui",
    "organization": null,
    "phones": [],
    "photo_source": null,
    "photo_uri": "/static/img/nophoto.png",
    "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
    "role": null
}

我的“root”对象有一个id但嵌入对象“email”却没有。因为在mongodb中,id不在子文档上设置,而只在根文档上设置。

这样ember-data看到“email”对象没有id,然后它试图通过API获取完整的对象。例如:GET / app / api / v1 / email / set // 404(未找到)

为了确保这是怀特问题,我试图返回带有假ID字段的Mongodb子文档。喜欢:(见电子邮件对象的差异)

{
    "additional_names": null,
    "addresses": [],
    "birthday": null,
    "civility": null,
    "emails": [
        {
            "id": 431,
            "email": "alexandre@test.com",
            "label": null,
            "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
            "type": "HOME"
        }
    ],
    "firstname": "Alexandre",
    "gravatar_mail": null,
    "groups": [],
    "id": "4f86c4774ab63c2417000001",
    "name": "Simoui",
    "organization": null,
    "phones": [],
    "photo_source": null,
    "photo_uri": "/static/img/nophoto.png",
    "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
    "role": null
}

然后我没有问题一切都很好。所以我的问题是:有没有办法解决它?

1 个答案:

答案 0 :(得分:3)

我已经开始尝试解决方法了。我只在只读的基础上使用没有ID的嵌入对象,所以我没有测试保存,创建和正确的模型状态管理(isDirty等)......但到目前为止,这已经解决了我的类似问题。

不幸的是我需要修改ember-data源。请参阅ember-data的my fork

我的更改范围涉及修改hasAssociation()的{​​{1}}功能。我所做的是在第一次访问关联的计算属性返回时注入伪ID。我在定义DS.hasMany的闭包中保留了一个客户端ID计数器injectedIdCounter,以及一个获取ID并更新计数器的函数。然后我定义了一个新选项hasAssociation(),它是一个没有ID的嵌入式子文档。每次在关联上调用trueEmbedded时,都会检查元素的ID,如果id不存在,则会注入一个。如果已添加ID,则需要调用get(),以便将修改后的关联存储回父对象。这至少解决了我的问题。这是我的代码。

set()

你会认为嵌入式文档不需要ID,但是ember-data首先获取对象的所有ID然后对象本身,即使对于嵌入式关联,也意味着像这样的一些混乱的解决方案是必须的。

希望这将在未来的Ember版本中修复。

干杯, 凯文