3

我正在尝试创建具有 2 个相同类型的“hasMany”关系的主干关系模型,但我收到错误消息:“无法在“(myReverseRelationName)”上为模型 = 子创建关系 = 子:已被关系占用=孩子”。这是应该被允许的,还是我做错了?谢谢。

我创建了一个 jsFiddle,所以你们可以自己看看:http: //jsfiddle.net/Mu68f/5/

这是代码:

Animal = Backbone.RelationalModel.extend({
    urlRoot: '/animal/',
});

AnimalCollection = Backbone.Collection.extend({
    model: Animal
});

Zoo = Backbone.RelationalModel.extend({    
    relations: [
        {
            type: Backbone.HasMany,
            key: 'largeAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
        {
            type: Backbone.HasMany,
            key: 'smallAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
    ]
});

// initialize our zoo
var zoo = new Zoo({
    largeAnimals: [{name: "Big Bill"}],
    smallAnimals: [{name: "Pee Wee"}]
});
console.log(zoo);
4

1 回答 1

2

问题是 largeAnimals 和 smallAnimals 都在“Animal”模型类中,但没有对 Zoo 的不同引用。

在关联方面,如果一个模型(即动物)以两种不同的方式(小和大)属于另一个模型(动物园),那么它应该有两种不同类型的“外键”,它们以两种不同的方式引用关联的模型方法。

就简单性而言,我会采取将“大”或“小”作为属性添加到 Animal 类的路线,而不是尝试以两种不同的方式将其与 Zoo 关联。

但是,如果您想以这种方式将动物与动物园联系起来,您可以这样做:

Animal = Backbone.RelationalModel.extend({
    urlRoot: '/animal/',
});

AnimalCollection = Backbone.Collection.extend({
    model: Animal
});

Zoo = Backbone.RelationalModel.extend({    
    relations: [
        {
            type: Backbone.HasMany,
            key: 'largeAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
        {
            type: Backbone.HasMany,
            key: 'smallAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'residesIn', // different key to refer to Zoo
                includeInJSON: false
            }
        },
    ]
});

正如你所看到的,我给了smallAnimal一个不同类型的键来引用 Zoo。这也意味着当您smallAnimal从服务器获取 s 时,smallAnimal对象应该具有指向 Zoo 的属性residesIn

于 2013-07-24T16:40:37.290 回答