backbone-relational-rails 0.8.7 → 0.8.8

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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 383e74d8144f6aa8fde07a6dcfbd2a924559c5b5
4
- data.tar.gz: 4971d471d1dc3134765e99980ec3adcd68e6638a
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTRmNmM3YWRjY2Q2NzU3YzAyMzNlNzY2MzY2MzE4ZWU5NDI4YzZmNA==
5
+ data.tar.gz: !binary |-
6
+ ZGUwOTE4MDEyZWU0MGJlYzQ5NmM1NTgyZjQyOWU2YTZlMmVjZmQzYg==
5
7
  SHA512:
6
- metadata.gz: be19e63711b13f668de3b1f0bc4d9308ad3a1570c7c52dd7568bf58c9f874f8ffb6be71b916e034830a07d3882fe3b5e1f7ee9437b06f601521b237edbc40215
7
- data.tar.gz: 92937ff96c6069ac98c879176a8983fbef8dfe3cd7fcd3972260c1bed2aeb2872df2ca5a8e4b9d0dcf27483ffe630030bf5f86b36b9996d09fa4a4292405efc8
8
+ metadata.gz: !binary |-
9
+ Mzc2M2Q2MzZlMTZjMTQ3ODAyMTdkMzIzYTBjOTgxMmNkZjlkMzFkZDI2MWRl
10
+ N2Q4NTQyYzg1NGM3NTk3YzQzNTllNTExNTc1NDRlNTQ1MWJkMGQ3NjdlMDlk
11
+ NDM4YzRiOTQwZmIzMDJlNWI3N2IzMzhiYTYwNGNiZmQzNzM2MGM=
12
+ data.tar.gz: !binary |-
13
+ MDIxNTlhYjA5MTYzYzI0NDM4YWQ2M2VjYTFiNjVmYTUxZDg3NjU1NTllMTIw
14
+ NTUxNzk0Mjc2YWJhNzcxMmUzYzU5Mjk4MjVkMDE4ODY5MTE4N2VkNjY0ODA4
15
+ ZDkwZjEzNTM4NGEzOWQ0NjlmNzU4Mzg1YjlhNjRlYzhkMTk5ZWE=
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.8.7 == Backbone-relational 0.8.7
21
+ backbone-relational-rails 0.8.8 == Backbone-relational 0.8.8
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
@@ -26,9 +26,9 @@ bug be discovered, a 4th version identifier will be added and incremented.
26
26
 
27
27
  ## Backbone Version
28
28
 
29
- This release of Backbone-relational is only compatible with Backbone >= 1.0.0.
29
+ This release of Backbone-relational is only compatible with Backbone >= 1.1.2.
30
30
 
31
31
  ## Acknowledgements
32
32
 
33
- Many thanks to @derekprior for his [tutorial on gemifying assets for Rails](http://prioritized.net/blog/gemify-assets-for-rails/) and his
33
+ Many thanks to [@derekprior](http://github.com/derekprior) for his [tutorial on gemifying assets for Rails](http://prioritized.net/blog/gemify-assets-for-rails/) and his
34
34
  [momentjs-rails gem](http://github.com/derekprior/momentjs-rails).
@@ -1,7 +1,7 @@
1
1
  module Backbone
2
2
  module Relational
3
3
  module Rails
4
- VERSION = "0.8.7"
4
+ VERSION = "0.8.8"
5
5
  end
6
6
  end
7
7
  end
@@ -1,6 +1,6 @@
1
1
  /* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab: */
2
2
  /**
3
- * Backbone-relational.js 0.8.7
3
+ * Backbone-relational.js 0.8.8
4
4
  * (c) 2011-2013 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.
@@ -9,60 +9,57 @@
9
9
  *
10
10
  * Example:
11
11
  *
12
- Zoo = Backbone.RelationalModel.extend( {
13
- relations: [ {
14
- type: Backbone.HasMany,
15
- key: 'animals',
16
- relatedModel: 'Animal',
17
- reverseRelation: {
18
- key: 'livesIn',
19
- includeInJSON: 'id'
20
- // 'relatedModel' is automatically set to 'Zoo'; the 'relationType' to 'HasOne'.
21
- }
22
- } ],
23
-
24
- toString: function() {
25
- return this.get( 'name' );
26
- }
27
- } );
28
-
29
- Animal = Backbone.RelationalModel.extend( {
30
- toString: function() {
31
- return this.get( 'species' );
32
- }
33
- } );
12
+ Zoo = Backbone.RelationalModel.extend({
13
+ relations: [ {
14
+ type: Backbone.HasMany,
15
+ key: 'animals',
16
+ relatedModel: 'Animal',
17
+ reverseRelation: {
18
+ key: 'livesIn',
19
+ includeInJSON: 'id'
20
+ // 'relatedModel' is automatically set to 'Zoo'; the 'relationType' to 'HasOne'.
21
+ }
22
+ } ],
23
+
24
+ toString: function() {
25
+ return this.get( 'name' );
26
+ }
27
+ });
28
+
29
+ Animal = Backbone.RelationalModel.extend({
30
+ toString: function() {
31
+ return this.get( 'species' );
32
+ }
33
+ });
34
34
 
35
35
  // Creating the zoo will give it a collection with one animal in it: the monkey.
36
36
  // The animal created after that has a relation `livesIn` that points to the zoo it's currently associated with.
37
37
  // If you instantiate (or fetch) the zebra later, it will automatically be added.
38
38
 
39
- var zoo = new Zoo( {
40
- name: 'Artis',
41
- animals: [ { id: 'monkey-1', species: 'Chimp' }, 'lion-1', 'zebra-1' ]
42
- } );
39
+ var zoo = new Zoo({
40
+ name: 'Artis',
41
+ animals: [ { id: 'monkey-1', species: 'Chimp' }, 'lion-1', 'zebra-1' ]
42
+ });
43
43
 
44
44
  var lion = new Animal( { id: 'lion-1', species: 'Lion' } ),
45
- monkey = zoo.get( 'animals' ).first(),
46
- sameZoo = lion.get( 'livesIn' );
45
+ monkey = zoo.get( 'animals' ).first(),
46
+ sameZoo = lion.get( 'livesIn' );
47
47
  */
48
- ( function( undefined ) {
49
- "use strict";
50
-
51
- /**
52
- * CommonJS shim
53
- **/
54
- var _, Backbone, exports;
55
- if ( typeof window === 'undefined' ) {
56
- _ = require( 'underscore' );
57
- Backbone = require( 'backbone' );
58
- exports = Backbone;
59
- typeof module === 'undefined' || ( module.exports = exports );
48
+ ( function( root, factory ) {
49
+ // Set up Backbone-relational for the environment. Start with AMD.
50
+ if ( typeof define === 'function' && define.amd ) {
51
+ define( [ 'exports', 'backbone', 'underscore' ], factory );
52
+ }
53
+ // Next for Node.js or CommonJS.
54
+ else if ( typeof exports !== 'undefined' ) {
55
+ factory( exports, require( 'backbone' ), require( 'underscore' ) );
60
56
  }
57
+ // Finally, as a browser global. Use `root` here as it references `window`.
61
58
  else {
62
- _ = window._;
63
- Backbone = window.Backbone;
64
- exports = window;
59
+ factory( root, root.Backbone, root._ );
65
60
  }
61
+ }( this, function( exports, Backbone, _ ) {
62
+ "use strict";
66
63
 
67
64
  Backbone.Relational = {
68
65
  showWarnings: true
@@ -230,7 +227,7 @@
230
227
  */
231
228
  setupSuperModel: function( modelType ) {
232
229
  _.find( this._subModels, function( subModelDef ) {
233
- return _.find( subModelDef.subModels || [], function( subModelTypeName, typeValue ) {
230
+ return _.filter( subModelDef.subModels || [], function( subModelTypeName, typeValue ) {
234
231
  var subModelType = this.getObjectByName( subModelTypeName );
235
232
 
236
233
  if ( modelType === subModelType ) {
@@ -243,7 +240,7 @@
243
240
  modelType._subModelTypeAttribute = subModelDef.superModelType.prototype.subModelTypeAttribute;
244
241
  return true;
245
242
  }
246
- }, this );
243
+ }, this ).length;
247
244
  }, this );
248
245
  },
249
246
 
@@ -349,8 +346,8 @@
349
346
  rootModel = rootModel._superModel;
350
347
  }
351
348
 
352
- var coll = _.find( this._collections, function(item) {
353
- return item.model === rootModel;
349
+ var coll = _.find( this._collections, function( item ) {
350
+ return item.model === rootModel;
354
351
  });
355
352
 
356
353
  if ( !coll && create !== false ) {
@@ -459,8 +456,6 @@
459
456
  if ( coll ) {
460
457
  var modelColl = model.collection;
461
458
  coll.add( model );
462
- this.listenTo( model, 'destroy', this.unregister, this );
463
- this.listenTo( model, 'relational:unregister', this.unregister, this );
464
459
  model.collection = modelColl;
465
460
  }
466
461
  },
@@ -489,6 +484,12 @@
489
484
  */
490
485
  update: function( model ) {
491
486
  var coll = this.getCollection( model );
487
+
488
+ // Register a model if it isn't yet (which happens if it was created without an id).
489
+ if ( !coll.contains( model ) ) {
490
+ this.register( model );
491
+ }
492
+
492
493
  // This triggers updating the lookup indices kept in a collection
493
494
  coll._onModelEvent( 'change:' + model.idAttribute, model, coll );
494
495
 
@@ -497,20 +498,47 @@
497
498
  },
498
499
 
499
500
  /**
500
- * Remove a 'model' from the store.
501
- * @param {Backbone.RelationalModel} model
502
- * @param {Backbone.Collection} [collection]
503
- * @param {Object} [options]
501
+ * Unregister from the store: a specific model, a collection, or a model type.
502
+ * @param {Backbone.RelationalModel|Backbone.RelationalModel.constructor|Backbone.Collection} type
504
503
  */
505
- unregister: function( model, collection, options ) {
506
- this.stopListening( model );
504
+ unregister: function( type ) {
505
+ var coll,
506
+ models;
507
507
 
508
- _.each( model.getRelations(), function( rel ) {
509
- rel.stopListening();
510
- });
508
+ if ( type instanceof Backbone.Model ) {
509
+ coll = this.getCollection( type );
510
+ models = [ type ];
511
+ }
512
+ else if ( type instanceof Backbone.Collection ) {
513
+ coll = this.getCollection( type.model );
514
+ models = _.clone( type.models );
515
+ }
516
+ else {
517
+ coll = this.getCollection( type );
518
+ models = _.clone( coll.models );
519
+ }
511
520
 
512
- var coll = this.getCollection( model );
513
- coll && coll.remove( model, options );
521
+ _.each( models, function( model ) {
522
+ this.stopListening( model );
523
+ _.invoke( model.getRelations(), 'stopListening' );
524
+ }, this );
525
+
526
+
527
+ // If we've unregistered an entire store collection, reset the collection (which is much faster).
528
+ // Otherwise, remove each model one by one.
529
+ if ( _.contains( this._collections, type ) ) {
530
+ coll.reset( [] );
531
+ }
532
+ else {
533
+ _.each( models, function( model ) {
534
+ if ( coll.get( model ) ) {
535
+ coll.remove( model );
536
+ }
537
+ else {
538
+ coll.trigger( 'relational:remove', model, coll );
539
+ }
540
+ }, this );
541
+ }
514
542
  },
515
543
 
516
544
  /**
@@ -519,6 +547,12 @@
519
547
  */
520
548
  reset: function() {
521
549
  this.stopListening();
550
+
551
+ // Unregister each collection to remove event listeners
552
+ _.each( this._collections, function( coll ) {
553
+ this.unregister( coll );
554
+ }, this );
555
+
522
556
  this._collections = [];
523
557
  this._subModels = [];
524
558
  this._modelScopes = [ exports ];
@@ -684,10 +718,7 @@
684
718
  */
685
719
  setRelated: function( related ) {
686
720
  this.related = related;
687
-
688
- this.instance.acquire();
689
721
  this.instance.attributes[ this.key ] = related;
690
- this.instance.release();
691
722
  },
692
723
 
693
724
  /**
@@ -713,10 +744,10 @@
713
744
  var models = !_.isUndefined( model ) ? [ model ] : this.related && ( this.related.models || [ this.related ] );
714
745
  _.each( models || [], function( related ) {
715
746
  _.each( related.getRelations() || [], function( relation ) {
716
- if ( this._isReverseRelation( relation ) ) {
717
- reverseRelations.push( relation );
718
- }
719
- }, this );
747
+ if ( this._isReverseRelation( relation ) ) {
748
+ reverseRelations.push( relation );
749
+ }
750
+ }, this );
720
751
  }, this );
721
752
 
722
753
  return reverseRelations;
@@ -1049,7 +1080,7 @@
1049
1080
  /**
1050
1081
  * When a model is added to a 'HasMany', trigger 'add' on 'this.instance' and notify reverse relations.
1051
1082
  * (should be 'HasOne', must set 'this.instance' as their related).
1052
- */
1083
+ */
1053
1084
  handleAddition: function( model, coll, options ) {
1054
1085
  //console.debug('handleAddition called; args=%o', arguments);
1055
1086
  options = options ? _.clone( options ) : {};
@@ -1081,7 +1112,7 @@
1081
1112
 
1082
1113
  var dit = this;
1083
1114
  !options.silent && Backbone.Relational.eventQueue.add( function() {
1084
- dit.instance.trigger( 'remove:' + dit.key, model, dit.related, options );
1115
+ dit.instance.trigger( 'remove:' + dit.key, model, dit.related, options );
1085
1116
  });
1086
1117
  },
1087
1118
 
@@ -1145,7 +1176,7 @@
1145
1176
  // Example: event for "p.on( 'add:jobs' )" -> "p.get('jobs').add( { company: c.id, person: p.id } )".
1146
1177
  if ( options && options.collection ) {
1147
1178
  var dit = this,
1148
- collection = this.collection = options.collection;
1179
+ collection = this.collection = options.collection;
1149
1180
 
1150
1181
  // Prevent `collection` from cascading down to nested models; they shouldn't go into this `if` clause.
1151
1182
  delete options.collection;
@@ -1168,6 +1199,7 @@
1168
1199
  }
1169
1200
 
1170
1201
  Backbone.Relational.store.processOrphanRelations();
1202
+ Backbone.Relational.store.listenTo( this, 'relational:unregister', Backbone.Relational.store.unregister );
1171
1203
 
1172
1204
  this._queue = new Backbone.BlockingQueue();
1173
1205
  this._queue.block();
@@ -1190,47 +1222,53 @@
1190
1222
  var dit = this,
1191
1223
  args = arguments;
1192
1224
 
1193
- Backbone.Relational.eventQueue.add( function() {
1194
- if ( !dit._isInitialized ) {
1195
- return;
1196
- }
1197
-
1198
- // Determine if the `change` event is still valid, now that all relations are populated
1199
- var changed = true;
1200
- if ( eventName === 'change' ) {
1201
- // `hasChanged` may have gotten reset by nested calls to `set`.
1202
- changed = dit.hasChanged() || dit._attributeChangeFired;
1203
- dit._attributeChangeFired = false;
1204
- }
1205
- else {
1206
- var attr = eventName.slice( 7 ),
1207
- rel = dit.getRelation( attr );
1208
-
1209
- if ( rel ) {
1210
- // If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
1211
- // These take precedence over `change:attr` events triggered by `Model.set`.
1212
- // The relation sets a fourth attribute to `true`. If this attribute is present,
1213
- // continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
1214
- changed = ( args[ 4 ] === true );
1215
-
1216
- // If this event was triggered by a relation, set the right value in `this.changed`
1217
- // (a Collection or Model instead of raw data).
1218
- if ( changed ) {
1219
- dit.changed[ attr ] = args[ 2 ];
1225
+ if ( !Backbone.Relational.eventQueue.isLocked() ) {
1226
+ // If we're not in a more complicated nested scenario, fire the change event right away
1227
+ Backbone.Model.prototype.trigger.apply( dit, args );
1228
+ }
1229
+ else {
1230
+ Backbone.Relational.eventQueue.add( function() {
1231
+ // Determine if the `change` event is still valid, now that all relations are populated
1232
+ var changed = true;
1233
+ if ( eventName === 'change' ) {
1234
+ // `hasChanged` may have gotten reset by nested calls to `set`.
1235
+ changed = dit.hasChanged() || dit._attributeChangeFired;
1236
+ dit._attributeChangeFired = false;
1237
+ }
1238
+ else {
1239
+ var attr = eventName.slice( 7 ),
1240
+ rel = dit.getRelation( attr );
1241
+
1242
+ if ( rel ) {
1243
+ // If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
1244
+ // These take precedence over `change:attr` events triggered by `Model.set`.
1245
+ // The relation sets a fourth attribute to `true`. If this attribute is present,
1246
+ // continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
1247
+ changed = ( args[ 4 ] === true );
1248
+
1249
+ // If this event was triggered by a relation, set the right value in `this.changed`
1250
+ // (a Collection or Model instead of raw data).
1251
+ if ( changed ) {
1252
+ dit.changed[ attr ] = args[ 2 ];
1253
+ }
1254
+ // Otherwise, this event is from `Model.set`. If the relation doesn't report a change,
1255
+ // remove attr from `dit.changed` so `hasChanged` doesn't take it into account.
1256
+ else if ( !rel.changed ) {
1257
+ delete dit.changed[ attr ];
1258
+ }
1220
1259
  }
1221
- // Otherwise, this event is from `Model.set`. If the relation doesn't report a change,
1222
- // remove attr from `dit.changed` so `hasChanged` doesn't take it into account.
1223
- else if ( !rel.changed ) {
1224
- delete dit.changed[ attr ];
1260
+ else if ( changed ) {
1261
+ dit._attributeChangeFired = true;
1225
1262
  }
1226
1263
  }
1227
- else if ( changed ) {
1228
- dit._attributeChangeFired = true;
1229
- }
1230
- }
1231
1264
 
1232
- changed && Backbone.Model.prototype.trigger.apply( dit, args );
1233
- });
1265
+ changed && Backbone.Model.prototype.trigger.apply( dit, args );
1266
+ });
1267
+ }
1268
+ }
1269
+ else if ( eventName === 'destroy' ) {
1270
+ Backbone.Model.prototype.trigger.apply( this, arguments );
1271
+ Backbone.Relational.store.unregister( this );
1234
1272
  }
1235
1273
  else {
1236
1274
  Backbone.Model.prototype.trigger.apply( this, arguments );
@@ -1417,8 +1455,8 @@
1417
1455
 
1418
1456
  // Go through all splits and return the final result
1419
1457
  var splits = attr.split( '.' );
1420
- var result = _.reduce(splits, function( model, split ) {
1421
- if ( _.isNull(model) || _.isUndefined( model ) ) {
1458
+ var result = _.reduce( splits, function( model, split ) {
1459
+ if ( _.isNull( model ) || _.isUndefined( model ) ) {
1422
1460
  // Return undefined if the path cannot be expanded
1423
1461
  return undefined;
1424
1462
  }
@@ -1466,7 +1504,12 @@
1466
1504
  // Ideal place to set up relations, if this is the first time we're here for this model
1467
1505
  if ( !this._isInitialized && !this.isLocked() ) {
1468
1506
  this.constructor.initializeModelHierarchy();
1469
- Backbone.Relational.store.register( this );
1507
+
1508
+ // Only register models that have an id. A model will be registered when/if it gets an id later on.
1509
+ if ( newId || newId === 0 ) {
1510
+ Backbone.Relational.store.register( this );
1511
+ }
1512
+
1470
1513
  this.initializeRelations( options );
1471
1514
  }
1472
1515
  // The store should know about an `id` update asap
@@ -1538,7 +1581,7 @@
1538
1581
  if ( rel instanceof Backbone.HasMany ) {
1539
1582
  value = value.concat( rel.keyIds );
1540
1583
  }
1541
- else if ( rel instanceof Backbone.HasOne ) {
1584
+ else if ( rel instanceof Backbone.HasOne ) {
1542
1585
  value = value || rel.keyId;
1543
1586
 
1544
1587
  if ( !value && !_.isObject( rel.keyContents ) ) {
@@ -1705,7 +1748,7 @@
1705
1748
 
1706
1749
  inheritRelations: function() {
1707
1750
  // Bail out if we've been here before.
1708
- if (!_.isUndefined( this._superModel ) && !_.isNull( this._superModel )) {
1751
+ if ( !_.isUndefined( this._superModel ) && !_.isNull( this._superModel ) ) {
1709
1752
  return;
1710
1753
  }
1711
1754
  // Try to initialize the _superModel.
@@ -1738,7 +1781,7 @@
1738
1781
 
1739
1782
  /**
1740
1783
  * Find an instance of `this` type in 'Backbone.Relational.store'.
1741
- * A new model is created with `attributes` (unless `options.create` is explicitly set to `false`) if no match is found.
1784
+ * A new model is created if no matching model is found, `attributes` is an object, and `options.create` is true.
1742
1785
  * - If `attributes` is a string or a number, `findOrCreate` will query the `store` and return a model if found.
1743
1786
  * - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.update` is `false`.
1744
1787
  * @param {Object|String|Number} attributes Either a model's id, or the attributes used to create or update a model.
@@ -1768,7 +1811,7 @@
1768
1811
  model.set( parsedAttributes, options );
1769
1812
  }
1770
1813
  else if ( !model && options.create !== false ) {
1771
- model = this.build( attributes, options );
1814
+ model = this.build( parsedAttributes, _.defaults( { parse: false }, options ) );
1772
1815
  }
1773
1816
  }
1774
1817
 
@@ -1810,7 +1853,7 @@
1810
1853
  * (which sets the new properties on it if found), or instantiates a new model.
1811
1854
  */
1812
1855
  Backbone.Collection.prototype.__prepareModel = Backbone.Collection.prototype._prepareModel;
1813
- Backbone.Collection.prototype._prepareModel = function ( attrs, options ) {
1856
+ Backbone.Collection.prototype._prepareModel = function( attrs, options ) {
1814
1857
  var model;
1815
1858
 
1816
1859
  if ( attrs instanceof Backbone.Model ) {
@@ -1855,11 +1898,12 @@
1855
1898
  models = this.parse( models, options );
1856
1899
  }
1857
1900
 
1858
- models = _.isArray( models ) ? models.slice() : ( models ? [ models ] : [] );
1859
-
1860
- var newModels = [],
1901
+ var singular = !_.isArray( models ),
1902
+ newModels = [],
1861
1903
  toAdd = [];
1862
1904
 
1905
+ models = singular ? ( models ? [ models ] : [] ) : _.clone( models );
1906
+
1863
1907
  //console.debug( 'calling add on coll=%o; model=%o, options=%o', this, models, options );
1864
1908
  _.each( models, function( model ) {
1865
1909
  if ( !( model instanceof Backbone.Model ) ) {
@@ -1882,6 +1926,7 @@
1882
1926
 
1883
1927
  // Add 'models' in a single batch, so the original add will only be called once (and thus 'sort', etc).
1884
1928
  // If `parse` was specified, the collection and contained models have been parsed now.
1929
+ toAdd = singular ? ( toAdd.length ? toAdd[ 0 ] : null ) : toAdd;
1885
1930
  var result = set.call( this, toAdd, _.defaults( { parse: false }, options ) );
1886
1931
 
1887
1932
  _.each( newModels, function( model ) {
@@ -1904,10 +1949,11 @@
1904
1949
  return remove.apply( this, arguments );
1905
1950
  }
1906
1951
 
1907
- models = _.isArray( models ) ? models.slice() : [ models ];
1908
- options || ( options = {} );
1952
+ var singular = !_.isArray( models ),
1953
+ toRemove = [];
1909
1954
 
1910
- var toRemove = [];
1955
+ models = singular ? ( models ? [ models ] : [] ) : _.clone( models );
1956
+ options || ( options = {} );
1911
1957
 
1912
1958
  //console.debug('calling remove on coll=%o; models=%o, options=%o', this, models, options );
1913
1959
  _.each( models, function( model ) {
@@ -1915,10 +1961,10 @@
1915
1961
  model && toRemove.push( model );
1916
1962
  }, this );
1917
1963
 
1918
- var result = remove.call( this, toRemove, options );
1964
+ var result = remove.call( this, singular ? ( toRemove.length ? toRemove[ 0 ] : null ) : toRemove, options );
1919
1965
 
1920
1966
  _.each( toRemove, function( model ) {
1921
- this.trigger('relational:remove', model, this, options);
1967
+ this.trigger( 'relational:remove', model, this, options );
1922
1968
  }, this );
1923
1969
 
1924
1970
  return result;
@@ -1994,4 +2040,4 @@
1994
2040
 
1995
2041
  return child;
1996
2042
  };
1997
- })();
2043
+ }));
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.8.7
4
+ version: 0.8.8
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-01-20 00:00:00.000000000 Z
11
+ date: 2014-04-02 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
@@ -32,11 +32,11 @@ executables: []
32
32
  extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
- - lib/backbone-relational-rails/version.rb
36
- - lib/backbone-relational-rails.rb
37
- - vendor/assets/javascripts/backbone-relational.js
38
35
  - LICENSE
39
36
  - README.md
37
+ - lib/backbone-relational-rails.rb
38
+ - lib/backbone-relational-rails/version.rb
39
+ - vendor/assets/javascripts/backbone-relational.js
40
40
  homepage: http://github.com/petedmarsh/backbone-relational-rails
41
41
  licenses:
42
42
  - MIT
@@ -48,17 +48,17 @@ 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.0.3
61
+ rubygems_version: 2.2.0
62
62
  signing_key:
63
63
  specification_version: 4
64
64
  summary: Backbone-relational packaged for Rails