3

我在理解Backbone-Relational 的文档时花了很长时间;目前还不是 100% 清楚要添加什么关系,例如includeInJSON. 最好通过说明我正在尝试创建的结构来描述我的困惑。我有一个Venue具有零个或多个嵌套Address模型(1:n 关系)的模型。后端存储是 MongoDB,它可以嵌入对象。我想以这种格式存储它:

{
    id: 12345,
    label: 'OPUS Cafe Bistro',
    addresses: [
        {
            type: 'mailing',
            address1: '#52 - 650 Duncan Ave',
            city: 'Penticton, BC'
        },
        {
            type: 'main',
            address1: '#106 - 1475 Fairview Rd',
            city: 'Penticton, BC'
        }
    ]
}

(请忽略丑陋的数据结构;为简洁起见,我对其进行了调整。)现在我相信我建立了和之间的关系VenueAddress因此:

var Venue = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasMany,
            key: 'addresses',
            relatedModel: 'Address',
            includeInJSON: false,
            collectionType: 'Addresses',
            reverseRelation: {
                key: 'venue'
            }
        }
});

如果我理解正确,我设置includeInJSON为 false 以防止Venue被序列化到venuekey in 中Address,但在 reverseRelation 下我includeInJSON留空以便将完整(没有场地属性)序列化为-属性中Address的数组正如我所希望的,例如。正确的?addressesVenue

出于同样的原因,我试图理解与加入式关系相关的相同概念。考虑Venue现在有一个organisationID字段:

/* venue in JSON format  */
{
    id: 12345,
    organisationID: 336,
    label: 'OPUS Cafe Bistro',
    addresses: []
}

/* and now for the organisation */
{
    id: 336,
    label: 'OPUS Entertainment Group'
}

使用文档中的示例,似乎更喜欢这种Backbone.HasMany关系,我认为我必须这样设置Organisation

var Organisation = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone:HasMany,
            key: 'venues',
            relatedModel: 'Venue',
            includeInJSON: Backbone.Model.prototype.idAttribute,
            collectionType: 'Venues',
            reverseRelation: {
                key: 'organisationID',
                includeInJSON: false
            }
        }
    ]
});

...应该序列化到上面的例子中,对吧?(即,Venue抓取Organisation'sid并将其插入organisationID,并且Organisation不序列化任何列表Venues

在此先感谢您的帮助——期待使用这个方便的库,在为 Backbone.js 编写我自己的关系胶水之后,我的眼球被抓了出来 :-)

4

1 回答 1

4

(从https://github.com/PaulUithol/Backbone-relational/issues/37复制我的答案在这里,希望更多人可以找到它)

我相信你现在已经弄清楚了,很抱歉这么晚才回复,但为了确定:选项(如collectionTypeincludeInJSON)适用key于同一个对象内的那个。

因此,对于您的第一个示例,您可以将关系写为:

var Venue = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasMany,
            key: 'addresses',
            relatedModel: 'Address',
            includeInJSON: true,
            collectionType: 'Addresses',
            reverseRelation: {
                key: 'venue',
                includeInJSON: 'id'
            }
        }
});

这将创建一个场地HasMany addresses。任何给定 Venue的addresses键使用collectionType Addresses, 并且完全序列化,因为includeInJSON设置为true(不是默认值includeInJSON也是true;所以如果您不指定它,它将完全序列化 arelationreverseRelation)。

简单地采用相同的reverseRelation选项,仅将它们应用于venue任何地址上的键。在这种情况下,它只会序列化venue.id它所链接到的场地的属性。

于 2011-11-02T10:24:26.103 回答