在Backbone-Relational中定义关系——不确定选项指向哪个方向



我有一个heckuva时间理解文档的骨干关系;在哪个关系中加入像includeInJSON这样的东西并不是100%清楚。也许最好通过说明我试图创建的结构来描述我的困惑。我有一个Venue模型,它有0个或多个嵌套的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,以防止VenueAddress中被序列化为venue键,但在reverseRelation下,我将includeInJSON留空,以便将完整的Address(没有场地属性)序列化为Venueaddresses属性中的数组-如我所希望的-例如。正确吗?

出于同样的原因,我试图理解与join-style关系相关的相同概念。考虑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抓取Organisationid并将其插入organisationID, Organisation不序列化Venues的任何列表)

提前感谢任何帮助-期待使用这个方便的库,在抓住我的眼球试图为Backbone.js编写我自己的关系胶:-)

(复制我的答案从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 addressesaddresses键对于任何给定的场地使用collectionType Addresses,并且是完全序列化的,因为includeInJSON被设置为true(并不是说includeInJSON的默认值也是true;所以如果你不指定它,它将完全序列化一个relationreverseRelation)。

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

相关内容

  • 没有找到相关文章

最新更新