Relational Many To Many

Example for doing Many To Many with relational

by Hristo Hristov

HTML

<script src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<script src="http://documentcloud.github.com/backbone/backbone-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone-relational/0.8.5/backbone-relational.min.js"></script>
<section>
  <p>To Think about JavaScript code below.</p>
</section>

JavaScript

var models = {}
models.ModelB = Backbone.RelationalModel.extend({
    urlRoot: 'someUrl'
});
models.CollectionB = Backbone.Collection.extend({
    model: models.ModelB
});

// Join table
models.ABJoin = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasOne,
            key: 'b',
            relatedModel: models.ModelB,
            reverseRelation: {
                key: 'abJoins',
                includeInJSON: false
            }
        }
    ],
 
    toJSON: function () {
        return this.get('b').id;
    }
});
 
models.ABJoinCollection = Backbone.Collection.extend({
    model: models.ABJoin
});

models.ModelA = Backbone.RelationalModel.extend({
    url: 'someUrl',
    relations: [
        {
            type: Backbone.HasMany,
            key: 'abJoins',
            relatedModel: models.ABJoin,
            collectionType: models.ABJoinCollection,
            keyDestination: 'bs',
            autoFetch: false,
            reverseRelation: {
                key: 'a',
                includeInJSON: true
            }
        }
    ],
    parse: function (response) {
        // plural of 'b'
        var bs = response.bs;
        if (bs) {
            response.abJoins = _.map(bs, function (b) {
                return {b: b};
            });
            delete response.bs;
        }
 
        return response;
    }
});

models.ACollection = Backbone.Collection.extend({
    model: models.ModelA
});

var modelJson = [
    {
        id : 'a1',
        bs : [
            { id : 'b1'},
            { id : 'b2'}
        ]
    },
    {
        id : 'a2',
        bs : [
            { id : 'b2'},
            { id : 'b3'}
        ]
    }
];
var myAs = new models.ACollection(modelJson, {parse:true});
// a1's b attrs
console.log("a1 b models");
var a1 = myAs.at(0);
var joins1 = a1.get('abJoins');
console.log(joins1.at(0).get('b').id);
console.log(joins1.at(1).get('b').id);
// a2's b attrs
console.log("a2 b models");
var a2 =...