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

时间:2011-10-05 00:11:22

标签: javascript json model-view-controller backbone.js backbone-relational

我有一个heckuva时间了解documentation for Backbone-Relational;关于添加includeInJSON等内容的关系并不是100%明确。可能最好通过说明我想要创建的结构来描述我的困惑。我有一个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被序列化为venue中的Address密钥,但在reverseRelation下我会离开includeInJSON为空,以便在Address的{​​{1}}属性中将完整的addresses(没有场地属性)序列化为数组 - 根据我希望的示例。正确的吗?

出于同样的原因,我试图理解与连接式关系相同的概念。请注意Venue现在有一个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的{​​{1}}并将其插入Organisation,而id不会序列化organisationID的任何列表

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

1 个答案:

答案 0 :(得分:4)

(将https://github.com/PaulUithol/Backbone-relational/issues/37的答案复制到此处,以便更多人可以找到它)

我相信你现在已经弄明白了,很抱歉这么晚回复,但只是为了确定:选项(如collectionTypeincludeInJSON)适用于{{1}那是在同一个对象中。

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

key

这会创建一个var Venue = Backbone.RelationalModel.extend({ relations: [ { type: Backbone.HasMany, key: 'addresses', relatedModel: 'Address', includeInJSON: true, collectionType: 'Addresses', reverseRelation: { key: 'venue', includeInJSON: 'id' } } }); HasMany的地点。任何给定Venue的addresses密钥都使用addresses collectionType,并且已完全序列化,因为Addresses设置为includeInJSON(而不是true的默认值{1}}也是includeInJSON;因此,如果您没有指定它,它将完全序列化truerelation

reverseRelation只使用相同的选项,仅对任何地址的reverseRelation键应用它们。在这种情况下,它只会序列化链接到的场地的venue属性。