backbone-relational-rails 0.8.8 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/README.md +1 -1
- data/lib/backbone-relational-rails/version.rb +1 -1
- data/vendor/assets/javascripts/backbone-relational.js +141 -107
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZGUwOTE4MDEyZWU0MGJlYzQ5NmM1NTgyZjQyOWU2YTZlMmVjZmQzYg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: de5400657b78386efd19c290e62ed5d2df7635c8
|
4
|
+
data.tar.gz: 5bfa9656cb2e4d3c0595802d67db79736373b19a
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
N2Q4NTQyYzg1NGM3NTk3YzQzNTllNTExNTc1NDRlNTQ1MWJkMGQ3NjdlMDlk
|
11
|
-
NDM4YzRiOTQwZmIzMDJlNWI3N2IzMzhiYTYwNGNiZmQzNzM2MGM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MDIxNTlhYjA5MTYzYzI0NDM4YWQ2M2VjYTFiNjVmYTUxZDg3NjU1NTllMTIw
|
14
|
-
NTUxNzk0Mjc2YWJhNzcxMmUzYzU5Mjk4MjVkMDE4ODY5MTE4N2VkNjY0ODA4
|
15
|
-
ZDkwZjEzNTM4NGEzOWQ0NjlmNzU4Mzg1YjlhNjRlYzhkMTk5ZWE=
|
6
|
+
metadata.gz: 1f02bab2dfbe65002c786cdcaa66526c76d4f7ae3af2cad4942b3b1f995ea5ae325366cfc5596ae71a915bf0c4d2fcc91384da705d0b3b678f7973225a9600c7
|
7
|
+
data.tar.gz: 5da615e1d9b60a0d0c03d84559441cf91341d571b5c719ec3d36b36bdcbb7625f331fd4e89946a11febc1b10cd7115ee9276339c8b97dfb091ccd0614f9a9d43
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ Add the following directive to your Javascript manifest file (application.js):
|
|
18
18
|
|
19
19
|
## Versioning
|
20
20
|
|
21
|
-
backbone-relational-rails 0.
|
21
|
+
backbone-relational-rails 0.9.0 == Backbone-relational 0.9.0
|
22
22
|
|
23
23
|
Every attempt is made to mirror the currently shipping Backbone-relational version number wherever possible.
|
24
24
|
The major, minor, and patch version numbers will always represent the Backbone-relational version. Should a gem
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab: */
|
2
2
|
/**
|
3
|
-
* Backbone-relational.js 0.
|
4
|
-
* (c) 2011-
|
3
|
+
* Backbone-relational.js 0.9.0
|
4
|
+
* (c) 2011-2014 Paul Uithol and contributors (https://github.com/PaulUithol/Backbone-relational/graphs/contributors)
|
5
5
|
*
|
6
6
|
* Backbone-relational may be freely distributed under the MIT license; see the accompanying LICENSE.txt.
|
7
7
|
* For details and documentation: https://github.com/PaulUithol/Backbone-relational.
|
@@ -182,7 +182,7 @@
|
|
182
182
|
initializeRelation: function( model, relation, options ) {
|
183
183
|
var type = !_.isString( relation.type ) ? relation.type : Backbone[ relation.type ] || this.getObjectByName( relation.type );
|
184
184
|
if ( type && type.prototype instanceof Backbone.Relation ) {
|
185
|
-
new type( model, relation, options ); // Also pushes the new Relation into `model._relations`
|
185
|
+
var rel = new type( model, relation, options ); // Also pushes the new Relation into `model._relations`
|
186
186
|
}
|
187
187
|
else {
|
188
188
|
Backbone.Relational.showWarnings && typeof console !== 'undefined' && console.warn( 'Relation=%o; missing or invalid relation type!', relation );
|
@@ -326,7 +326,7 @@
|
|
326
326
|
return;
|
327
327
|
}
|
328
328
|
|
329
|
-
new relation.type( model, relation );
|
329
|
+
var rel = new relation.type( model, relation );
|
330
330
|
}, this );
|
331
331
|
},
|
332
332
|
|
@@ -594,6 +594,12 @@
|
|
594
594
|
|
595
595
|
this.relatedModel = this.options.relatedModel;
|
596
596
|
|
597
|
+
// No 'relatedModel' is interpreted as self-referential
|
598
|
+
if ( _.isUndefined( this.relatedModel ) ) {
|
599
|
+
this.relatedModel = this.model;
|
600
|
+
}
|
601
|
+
|
602
|
+
// Otherwise, try to resolve the given value to an object
|
597
603
|
if ( _.isFunction( this.relatedModel ) && !( this.relatedModel.prototype instanceof Backbone.RelationalModel ) ) {
|
598
604
|
this.relatedModel = _.result( this, 'relatedModel' );
|
599
605
|
}
|
@@ -601,6 +607,7 @@
|
|
601
607
|
this.relatedModel = Backbone.Relational.store.getObjectByName( this.relatedModel );
|
602
608
|
}
|
603
609
|
|
610
|
+
|
604
611
|
if ( !this.checkPreconditions() ) {
|
605
612
|
return;
|
606
613
|
}
|
@@ -619,7 +626,7 @@
|
|
619
626
|
|
620
627
|
if ( instance ) {
|
621
628
|
var contentKey = this.keySource;
|
622
|
-
if ( contentKey !== this.key &&
|
629
|
+
if ( contentKey !== this.key && _.isObject( this.instance.get( this.key ) ) ) {
|
623
630
|
contentKey = this.key;
|
624
631
|
}
|
625
632
|
|
@@ -637,13 +644,13 @@
|
|
637
644
|
this.initialize( opts );
|
638
645
|
|
639
646
|
if ( this.options.autoFetch ) {
|
640
|
-
this.instance.
|
647
|
+
this.instance.getAsync( this.key, _.isObject( this.options.autoFetch ) ? this.options.autoFetch : {} );
|
641
648
|
}
|
642
649
|
|
643
650
|
// When 'relatedModel' are created or destroyed, check if it affects this relation.
|
644
651
|
this.listenTo( this.instance, 'destroy', this.destroy )
|
645
652
|
.listenTo( this.relatedCollection, 'relational:add relational:change:id', this.tryAddRelated )
|
646
|
-
.listenTo( this.relatedCollection, 'relational:remove', this.removeRelated )
|
653
|
+
.listenTo( this.relatedCollection, 'relational:remove', this.removeRelated );
|
647
654
|
}
|
648
655
|
};
|
649
656
|
// Fix inheritance :\
|
@@ -741,14 +748,21 @@
|
|
741
748
|
getReverseRelations: function( model ) {
|
742
749
|
var reverseRelations = [];
|
743
750
|
// Iterate over 'model', 'this.related.models' (if this.related is a Backbone.Collection), or wrap 'this.related' in an array.
|
744
|
-
var models = !_.isUndefined( model ) ? [ model ] : this.related && ( this.related.models || [ this.related ] )
|
745
|
-
|
746
|
-
|
751
|
+
var models = !_.isUndefined( model ) ? [ model ] : this.related && ( this.related.models || [ this.related ] ),
|
752
|
+
relations = null,
|
753
|
+
relation = null;
|
754
|
+
|
755
|
+
for( var i = 0; i < ( models || [] ).length; i++ ) {
|
756
|
+
relations = models[ i ].getRelations() || [];
|
757
|
+
|
758
|
+
for( var j = 0; j < relations.length; j++ ) {
|
759
|
+
relation = relations[ j ];
|
760
|
+
|
747
761
|
if ( this._isReverseRelation( relation ) ) {
|
748
762
|
reverseRelations.push( relation );
|
749
763
|
}
|
750
|
-
}
|
751
|
-
}
|
764
|
+
}
|
765
|
+
}
|
752
766
|
|
753
767
|
return reverseRelations;
|
754
768
|
},
|
@@ -1001,8 +1015,10 @@
|
|
1001
1015
|
var toAdd = [];
|
1002
1016
|
|
1003
1017
|
_.each( this.keyContents, function( attributes ) {
|
1018
|
+
var model = null;
|
1019
|
+
|
1004
1020
|
if ( attributes instanceof this.relatedModel ) {
|
1005
|
-
|
1021
|
+
model = attributes;
|
1006
1022
|
}
|
1007
1023
|
else {
|
1008
1024
|
// If `merge` is true, update models here, instead of during update.
|
@@ -1341,11 +1357,11 @@
|
|
1341
1357
|
|
1342
1358
|
/**
|
1343
1359
|
* Get a specific relation.
|
1344
|
-
* @param {string}
|
1345
|
-
* @return {Backbone.Relation} An instance of 'Backbone.Relation', if a relation was found for '
|
1360
|
+
* @param {string} attr The relation key to look for.
|
1361
|
+
* @return {Backbone.Relation} An instance of 'Backbone.Relation', if a relation was found for 'attr', or null.
|
1346
1362
|
*/
|
1347
|
-
getRelation: function(
|
1348
|
-
return this._relations[
|
1363
|
+
getRelation: function( attr ) {
|
1364
|
+
return this._relations[ attr ];
|
1349
1365
|
},
|
1350
1366
|
|
1351
1367
|
/**
|
@@ -1356,83 +1372,119 @@
|
|
1356
1372
|
return _.values( this._relations );
|
1357
1373
|
},
|
1358
1374
|
|
1375
|
+
|
1359
1376
|
/**
|
1360
|
-
*
|
1361
|
-
* @param {string}
|
1362
|
-
* @param
|
1363
|
-
* @
|
1364
|
-
* @return {jQuery.when[]} An array of request objects
|
1377
|
+
* Get a list of ids that will be fetched on a call to `getAsync`.
|
1378
|
+
* @param {string|Backbone.Relation} attr The relation key to fetch models for.
|
1379
|
+
* @param [refresh=false] Add ids for models that are already in the relation, refreshing them?
|
1380
|
+
* @return {Array} An array of ids that need to be fetched.
|
1365
1381
|
*/
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1369
|
-
|
1370
|
-
var models,
|
1371
|
-
setUrl,
|
1372
|
-
requests = [],
|
1373
|
-
rel = this.getRelation( key ),
|
1374
|
-
idsToFetch = rel && ( ( rel.keyIds && rel.keyIds.slice( 0 ) ) || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
|
1382
|
+
getIdsToFetch: function( attr, refresh ) {
|
1383
|
+
var rel = attr instanceof Backbone.Relation ? attr : this.getRelation( attr ),
|
1384
|
+
ids = rel ? ( rel.keyIds && rel.keyIds.slice( 0 ) ) || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) : [];
|
1375
1385
|
|
1376
1386
|
// On `refresh`, add the ids for current models in the relation to `idsToFetch`
|
1377
1387
|
if ( refresh ) {
|
1378
|
-
models = rel.related
|
1388
|
+
var models = rel.related && ( rel.related.models || [ rel.related ] );
|
1379
1389
|
_.each( models, function( model ) {
|
1380
1390
|
if ( model.id || model.id === 0 ) {
|
1381
|
-
|
1391
|
+
ids.push( model.id );
|
1382
1392
|
}
|
1383
1393
|
});
|
1384
1394
|
}
|
1385
1395
|
|
1396
|
+
return ids;
|
1397
|
+
},
|
1398
|
+
|
1399
|
+
/**
|
1400
|
+
* Get related objects. Returns a single promise, which can either resolve immediately (if the related model[s])
|
1401
|
+
* are already present locally, or after fetching the contents of the requested attribute.
|
1402
|
+
* @param {string} attr The relation key to fetch models for.
|
1403
|
+
* @param {Object} [options] Options for 'Backbone.Model.fetch' and 'Backbone.sync'.
|
1404
|
+
* @param {Boolean} [options.refresh=false] Fetch existing models from the server as well (in order to update them).
|
1405
|
+
* @return {jQuery.Deferred} A jQuery promise object. When resolved, its `done` callback will be called with
|
1406
|
+
* contents of `attr`.
|
1407
|
+
*/
|
1408
|
+
getAsync: function( attr, options ) {
|
1409
|
+
// Set default `options` for fetch
|
1410
|
+
options = _.extend( { add: true, remove: false, refresh: false }, options );
|
1411
|
+
|
1412
|
+
var dit = this,
|
1413
|
+
requests = [],
|
1414
|
+
rel = this.getRelation( attr ),
|
1415
|
+
idsToFetch = rel && this.getIdsToFetch( rel, options.refresh ),
|
1416
|
+
coll = rel.related instanceof Backbone.Collection ? rel.related : rel.relatedCollection;
|
1417
|
+
|
1386
1418
|
if ( idsToFetch && idsToFetch.length ) {
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1395
|
-
|
1396
|
-
|
1397
|
-
|
1419
|
+
var models = [],
|
1420
|
+
createdModels = [],
|
1421
|
+
setUrl,
|
1422
|
+
createModels = function() {
|
1423
|
+
// Find (or create) a model for each one that is to be fetched
|
1424
|
+
models = _.map( idsToFetch, function( id ) {
|
1425
|
+
var model = rel.relatedModel.findModel( id );
|
1426
|
+
|
1427
|
+
if ( !model ) {
|
1428
|
+
var attrs = {};
|
1429
|
+
attrs[ rel.relatedModel.prototype.idAttribute ] = id;
|
1430
|
+
model = rel.relatedModel.findOrCreate( attrs, options );
|
1431
|
+
createdModels.push( model );
|
1432
|
+
}
|
1398
1433
|
|
1399
|
-
|
1400
|
-
|
1434
|
+
return model;
|
1435
|
+
}, this );
|
1436
|
+
};
|
1401
1437
|
|
1402
1438
|
// Try if the 'collection' can provide a url to fetch a set of models in one request.
|
1403
|
-
|
1404
|
-
setUrl = rel.related.url( models );
|
1405
|
-
}
|
1406
|
-
|
1407
|
-
// An assumption is that when 'Backbone.Collection.url' is a function, it can handle building of set urls.
|
1439
|
+
// This assumes that when 'Backbone.Collection.url' is a function, it can handle building of set urls.
|
1408
1440
|
// To make sure it can, test if the url we got by supplying a list of models to fetch is different from
|
1409
1441
|
// the one supplied for the default fetch action (without args to 'url').
|
1410
|
-
if (
|
1442
|
+
if ( coll instanceof Backbone.Collection && _.isFunction( coll.url ) ) {
|
1443
|
+
var defaultUrl = coll.url();
|
1444
|
+
setUrl = coll.url( idsToFetch );
|
1445
|
+
|
1446
|
+
if ( setUrl === defaultUrl ) {
|
1447
|
+
createModels();
|
1448
|
+
setUrl = coll.url( models );
|
1449
|
+
|
1450
|
+
if ( setUrl === defaultUrl ) {
|
1451
|
+
setUrl = null;
|
1452
|
+
}
|
1453
|
+
}
|
1454
|
+
}
|
1455
|
+
|
1456
|
+
if ( setUrl ) {
|
1457
|
+
// Do a single request to fetch all models
|
1411
1458
|
var opts = _.defaults(
|
1412
1459
|
{
|
1413
1460
|
error: function() {
|
1414
|
-
|
1415
|
-
_.each( created, function( model ) {
|
1461
|
+
_.each( createdModels, function( model ) {
|
1416
1462
|
model.trigger( 'destroy', model, model.collection, options );
|
1417
|
-
options.error && options.error.apply( model, args );
|
1418
1463
|
});
|
1464
|
+
|
1465
|
+
options.error && options.error.apply( models, arguments );
|
1419
1466
|
},
|
1420
1467
|
url: setUrl
|
1421
1468
|
},
|
1422
1469
|
options
|
1423
1470
|
);
|
1424
1471
|
|
1425
|
-
requests = [
|
1472
|
+
requests = [ coll.fetch( opts ) ];
|
1426
1473
|
}
|
1427
1474
|
else {
|
1475
|
+
// Make a request per model to fetch
|
1476
|
+
if ( !models.length ) {
|
1477
|
+
createModels();
|
1478
|
+
}
|
1479
|
+
|
1428
1480
|
requests = _.map( models, function( model ) {
|
1429
1481
|
var opts = _.defaults(
|
1430
1482
|
{
|
1431
1483
|
error: function() {
|
1432
|
-
if ( _.contains(
|
1484
|
+
if ( _.contains( createdModels, model ) ) {
|
1433
1485
|
model.trigger( 'destroy', model, model.collection, options );
|
1434
|
-
options.error && options.error.apply( model, arguments );
|
1435
1486
|
}
|
1487
|
+
options.error && options.error.apply( models, arguments );
|
1436
1488
|
}
|
1437
1489
|
},
|
1438
1490
|
options
|
@@ -1442,47 +1494,20 @@
|
|
1442
1494
|
}
|
1443
1495
|
}
|
1444
1496
|
|
1445
|
-
return requests
|
1446
|
-
|
1447
|
-
|
1448
|
-
get: function( attr ) {
|
1449
|
-
var originalResult = Backbone.Model.prototype.get.call( this, attr );
|
1450
|
-
|
1451
|
-
// Use `originalResult` get if dotNotation not enabled or not required because no dot is in `attr`
|
1452
|
-
if ( !this.dotNotation || attr.indexOf( '.' ) === -1 ) {
|
1453
|
-
return originalResult;
|
1454
|
-
}
|
1455
|
-
|
1456
|
-
// Go through all splits and return the final result
|
1457
|
-
var splits = attr.split( '.' );
|
1458
|
-
var result = _.reduce( splits, function( model, split ) {
|
1459
|
-
if ( _.isNull( model ) || _.isUndefined( model ) ) {
|
1460
|
-
// Return undefined if the path cannot be expanded
|
1461
|
-
return undefined;
|
1462
|
-
}
|
1463
|
-
else if ( model instanceof Backbone.Model ) {
|
1464
|
-
return Backbone.Model.prototype.get.call( model, split );
|
1465
|
-
}
|
1466
|
-
else if ( model instanceof Backbone.Collection ) {
|
1467
|
-
return Backbone.Collection.prototype.at.call( model, split )
|
1468
|
-
}
|
1469
|
-
else {
|
1470
|
-
throw new Error( 'Attribute must be an instanceof Backbone.Model or Backbone.Collection. Is: ' + model + ', currentSplit: ' + split );
|
1497
|
+
return $.when.apply( null, requests ).then(
|
1498
|
+
function() {
|
1499
|
+
return Backbone.Model.prototype.get.call( dit, attr );
|
1471
1500
|
}
|
1472
|
-
|
1473
|
-
|
1474
|
-
if ( originalResult !== undefined && result !== undefined ) {
|
1475
|
-
throw new Error( "Ambiguous result for '" + attr + "'. direct result: " + originalResult + ", dotNotation: " + result );
|
1476
|
-
}
|
1477
|
-
|
1478
|
-
return originalResult || result;
|
1501
|
+
);
|
1479
1502
|
},
|
1480
1503
|
|
1481
1504
|
set: function( key, value, options ) {
|
1482
1505
|
Backbone.Relational.eventQueue.block();
|
1483
1506
|
|
1484
1507
|
// Duplicate backbone's behavior to allow separate key/value parameters, instead of a single 'attributes' object
|
1485
|
-
var attributes
|
1508
|
+
var attributes,
|
1509
|
+
result;
|
1510
|
+
|
1486
1511
|
if ( _.isObject( key ) || key == null ) {
|
1487
1512
|
attributes = key;
|
1488
1513
|
options = value;
|
@@ -1499,7 +1524,7 @@
|
|
1499
1524
|
// Check if we're not setting a duplicate id before actually calling `set`.
|
1500
1525
|
Backbone.Relational.store.checkId( this, newId );
|
1501
1526
|
|
1502
|
-
|
1527
|
+
result = Backbone.Model.prototype.set.apply( this, arguments );
|
1503
1528
|
|
1504
1529
|
// Ideal place to set up relations, if this is the first time we're here for this model
|
1505
1530
|
if ( !this._isInitialized && !this.isLocked() ) {
|
@@ -1612,6 +1637,13 @@
|
|
1612
1637
|
delete json[ rel.key ];
|
1613
1638
|
}
|
1614
1639
|
|
1640
|
+
// In case of `wait: true`, Backbone will simply push whatever's passed into `save` into attributes.
|
1641
|
+
// We'll want to get this information into the JSON, even if it doesn't conform to our normal
|
1642
|
+
// expectations of what's contained in it (no model/collection for a relation, etc).
|
1643
|
+
if ( value === null && options && options.wait ) {
|
1644
|
+
value = related;
|
1645
|
+
}
|
1646
|
+
|
1615
1647
|
if ( includeInJSON ) {
|
1616
1648
|
json[ rel.keyDestination ] = value;
|
1617
1649
|
}
|
@@ -1724,6 +1756,7 @@
|
|
1724
1756
|
}
|
1725
1757
|
}
|
1726
1758
|
}
|
1759
|
+
|
1727
1760
|
return null;
|
1728
1761
|
},
|
1729
1762
|
|
@@ -1783,7 +1816,7 @@
|
|
1783
1816
|
* Find an instance of `this` type in 'Backbone.Relational.store'.
|
1784
1817
|
* A new model is created if no matching model is found, `attributes` is an object, and `options.create` is true.
|
1785
1818
|
* - If `attributes` is a string or a number, `findOrCreate` will query the `store` and return a model if found.
|
1786
|
-
* - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.
|
1819
|
+
* - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.merge` is `false`.
|
1787
1820
|
* @param {Object|String|Number} attributes Either a model's id, or the attributes used to create or update a model.
|
1788
1821
|
* @param {Object} [options]
|
1789
1822
|
* @param {Boolean} [options.create=true]
|
@@ -1821,7 +1854,7 @@
|
|
1821
1854
|
/**
|
1822
1855
|
* Find an instance of `this` type in 'Backbone.Relational.store'.
|
1823
1856
|
* - If `attributes` is a string or a number, `find` will query the `store` and return a model if found.
|
1824
|
-
* - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.
|
1857
|
+
* - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.merge` is `false`.
|
1825
1858
|
* @param {Object|String|Number} attributes Either a model's id, or the attributes used to create or update a model.
|
1826
1859
|
* @param {Object} [options]
|
1827
1860
|
* @param {Boolean} [options.merge=true]
|
@@ -1891,7 +1924,7 @@
|
|
1891
1924
|
Backbone.Collection.prototype.set = function( models, options ) {
|
1892
1925
|
// Short-circuit if this Collection doesn't hold RelationalModels
|
1893
1926
|
if ( !( this.model.prototype instanceof Backbone.RelationalModel ) ) {
|
1894
|
-
return set.
|
1927
|
+
return set.call( this, models, options );
|
1895
1928
|
}
|
1896
1929
|
|
1897
1930
|
if ( options && options.parse ) {
|
@@ -1900,41 +1933,42 @@
|
|
1900
1933
|
|
1901
1934
|
var singular = !_.isArray( models ),
|
1902
1935
|
newModels = [],
|
1903
|
-
toAdd = []
|
1936
|
+
toAdd = [],
|
1937
|
+
model = null;
|
1904
1938
|
|
1905
1939
|
models = singular ? ( models ? [ models ] : [] ) : _.clone( models );
|
1906
1940
|
|
1907
1941
|
//console.debug( 'calling add on coll=%o; model=%o, options=%o', this, models, options );
|
1908
|
-
|
1942
|
+
for ( var i = 0; i < models.length; i++ ) {
|
1943
|
+
model = models[i];
|
1909
1944
|
if ( !( model instanceof Backbone.Model ) ) {
|
1910
1945
|
model = Backbone.Collection.prototype._prepareModel.call( this, model, options );
|
1911
1946
|
}
|
1912
|
-
|
1913
1947
|
if ( model ) {
|
1914
1948
|
toAdd.push( model );
|
1915
|
-
|
1916
1949
|
if ( !( this.get( model ) || this.get( model.cid ) ) ) {
|
1917
1950
|
newModels.push( model );
|
1918
1951
|
}
|
1919
1952
|
// If we arrive in `add` while performing a `set` (after a create, so the model gains an `id`),
|
1920
1953
|
// we may get here before `_onModelEvent` has had the chance to update `_byId`.
|
1921
|
-
else if ( model.id
|
1954
|
+
else if ( model.id !== null && model.id !== undefined ) {
|
1922
1955
|
this._byId[ model.id ] = model;
|
1923
1956
|
}
|
1924
1957
|
}
|
1925
|
-
}
|
1958
|
+
}
|
1926
1959
|
|
1927
1960
|
// Add 'models' in a single batch, so the original add will only be called once (and thus 'sort', etc).
|
1928
1961
|
// If `parse` was specified, the collection and contained models have been parsed now.
|
1929
1962
|
toAdd = singular ? ( toAdd.length ? toAdd[ 0 ] : null ) : toAdd;
|
1930
|
-
var result = set.call( this, toAdd, _.defaults( { parse: false }, options ) );
|
1963
|
+
var result = set.call( this, toAdd, _.defaults( { merge: false, parse: false }, options ) );
|
1931
1964
|
|
1932
|
-
|
1965
|
+
for ( i = 0; i < newModels.length; i++ ) {
|
1966
|
+
model = newModels[i];
|
1933
1967
|
// Fire a `relational:add` event for any model in `newModels` that has actually been added to the collection.
|
1934
1968
|
if ( this.get( model ) || this.get( model.cid ) ) {
|
1935
1969
|
this.trigger( 'relational:add', model, this, options );
|
1936
1970
|
}
|
1937
|
-
}
|
1971
|
+
}
|
1938
1972
|
|
1939
1973
|
return result;
|
1940
1974
|
};
|
@@ -1946,7 +1980,7 @@
|
|
1946
1980
|
Backbone.Collection.prototype.remove = function( models, options ) {
|
1947
1981
|
// Short-circuit if this Collection doesn't hold RelationalModels
|
1948
1982
|
if ( !( this.model.prototype instanceof Backbone.RelationalModel ) ) {
|
1949
|
-
return remove.
|
1983
|
+
return remove.call( this, models, options );
|
1950
1984
|
}
|
1951
1985
|
|
1952
1986
|
var singular = !_.isArray( models ),
|
@@ -2034,7 +2068,7 @@
|
|
2034
2068
|
|
2035
2069
|
// Override .extend() to automatically call .setup()
|
2036
2070
|
Backbone.RelationalModel.extend = function( protoProps, classProps ) {
|
2037
|
-
var child = Backbone.Model.extend.
|
2071
|
+
var child = Backbone.Model.extend.call( this, protoProps, classProps );
|
2038
2072
|
|
2039
2073
|
child.setup( this );
|
2040
2074
|
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backbone-relational-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Marsh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.1'
|
27
27
|
description: Backbone-relational provides one-to-one, one-to-many and many-to-one
|
@@ -48,18 +48,19 @@ require_paths:
|
|
48
48
|
- vendor
|
49
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
55
|
requirements:
|
56
|
-
- -
|
56
|
+
- - '>='
|
57
57
|
- !ruby/object:Gem::Version
|
58
58
|
version: '0'
|
59
59
|
requirements: []
|
60
60
|
rubyforge_project:
|
61
|
-
rubygems_version: 2.2.
|
61
|
+
rubygems_version: 2.2.2
|
62
62
|
signing_key:
|
63
63
|
specification_version: 4
|
64
64
|
summary: Backbone-relational packaged for Rails
|
65
65
|
test_files: []
|
66
|
+
has_rdoc:
|