Backbone.js: коллекция, содержащая несколько моделей с одинаковым идентификатором

У меня есть объединенная коллекция в Backbone, которая содержит фотографии и альбомы.

Чтобы отличить их, я добавил поле type, которое либо photo, либо album. Когда я заполняю коллекцию, я создаю различные модели в методе Collection#model

  model: (attrs, options) ->
    switch attrs.type
      when 'album' then new App.Models.Album(attrs, options)
      when 'photo' then new App.Models.Photo(attrs, options)

Теперь я обнаружил странную ошибку, когда добавление фотографии и альбома с тем же идентификатором (пусть 2) приводит к слиянию.

Я проследил это до этих LOC в исходном коде. Кажется, что он отменяется без создания вилки самой Базы. Я пробовал, но он также не прошел 35 тестов.

Я думал о 4 разных способах этого, я не знаю, какой из них лучше:

  • Я могу добавить префикс к id. Скажем, photo_2. Это приводит к изменению бэкэнд, а также к некоторым изменениям в интерфейсе, чтобы не попасть на сервер с /photos/photo_2
  • Я мог бы использовать Backbone и изменить эти LOC.
  • Я мог бы создать две отдельные коллекции, но должен иметь дело с слиянием и сортировкой в ​​представлении (что влияет на производительность клиентов и требует перезаписи бэкэнд).
  • Я мог бы начать с идентификатора фотографии, скажем 1000000. Это чрезвычайно снизило бы вероятность того, что данный пользователь, загрузивший фотографию с данным ID, также создал альбом с тем же идентификатором.

Ответ 1

Начиная с версии 1.2 вы можете использовать Collection.modelId, чтобы указать, как ваша коллекция будет уникально идентифицировать модели. В вашем случае вы можете сделать следующее, чтобы убедиться, что ваши типы имеют разные идентификаторы.

  var MyCollection = Backbone.Collection.extend({
    modelId: function (attrs) {
      return attrs.type + "-" + attrs.id;
    }
    // ...
  })

Ответ 2

Я бы предположил, что на альбоме и в фотографии вы добавляете следующее:

  idAttribute: 'uniqueId'
  parse: function(response) {
    response.uniqueId = type+'_'+response.id
    return response;
  }

Ответ 3

idAttribute:'uniqueId'

если этот уникальный идентификатор не известен при объявлении, попробуйте

idAttribute:'UUID'

Я сгенерировал один из https://www.uuidgenerator.net/ и поместил его здесь, этот атрибут, определенный здесь, не обязательно должен быть в модели, поэтому я просто вставил UUID.