Permalink
Browse files

Fixes #836, Fixes #708 -- going back to previous stance: two models w…

…ith the same id can't be added to the same collection.
  • Loading branch information...
1 parent cb7090d commit 8cfb243b8e46837c72f64811882d55c5e02cd569 @jashkenas committed Jan 11, 2012
Showing with 16 additions and 3 deletions.
  1. +4 −2 backbone.js
  2. +12 −1 test/collection.js
View
@@ -422,10 +422,12 @@
models = slice.call(models);
for (i = 0, l = models.length; i < l; i++) {
var model = models[i] = this._prepareModel(models[i], options);
- if (this._byCid[model.cid]) {
+ var hasId = model.id != null;
+ if (this._byCid[model.cid] || (hasId && this._byId[model.id])) {
throw new Error("Can't add the same model to a set twice");
}
- this._byId[model.id] = this._byCid[model.cid] = model;
+ this._byCid[model.cid] = model;
+ if (hasId) this._byId[model.id] = model;
model.bind('all', this._onModelEvent, this);
this.length++;
}
View
@@ -136,7 +136,7 @@ $(document).ready(function() {
}
});
- test("Collection: add model to collection twice", function() {
+ test("Collection: can't add model to collection twice", function() {
try {
// no id, same cid
var a2 = new Backbone.Model({label: a.label});
@@ -148,6 +148,17 @@ $(document).ready(function() {
}
});
+ test("Collection: can't add different model with same id to collection twice", function() {
+ var col = new Backbone.Collection;
+ try {
+ col.add({id: 101});
+ col.add({id: 101});
+ ok(false, "duplicate; expected add to fail");
+ } catch (e) {
+ equals(e.message, "Can't add the same model to a set twice");
+ }
+ });
+
test("Collection: add model to multiple collections", function() {
var counter = 0;
var e = new Backbone.Model({id: 10, label : 'e'});

3 comments on commit 8cfb243

@braddunbar
Collaborator

I understand not adding the model twice but why throw an error here? Couldn't the duplicate model just be skipped? Has there been discussion about this before elsewhere?

@jashkenas
Owner

It could be, but this usually indicates an error in your application logic, as the recently-closed tickets that raised this issue demonstrated. I think it's best to scream bloody murder here.

@braddunbar
Collaborator

I see. Ignoring a separate model instance with the same id would be inconsistent to say the least. Thanks for the clarification!

Please sign in to comment.