Подтвердить что ты не робот

Магистрально-реляционные передовые методы

Я новичок в Backbone-relational, я не уверен, что это правильный способ использования HasMany.

У меня есть модель Parent, у которой много children (по "многим" я имею в виду тысячи детей). Чтобы избежать проблем с производительностью, я запрашиваю у детей свой внешний ключ: /child/?parent=1 вместо создания огромного списка child_ids в Parent. Но, похоже, это не так, как работает базовая реляционная работа.

Итак, мне интересно, как правильно обращаться с этим.

1, Измените my json api, чтобы включить список дочерних идентификаторов в родительском, а затем отправьте тысячи идентификаторов в качестве рекомендации по базовым реляциям:

url = function(models) {
  return '/child/' + ( models ? 'set/' + _.pluck( models, 'id' ).join(';') + '/' : '');
}
// this will end up with a really long url: /child/set/1;2;3;4;...;9998;9999

2, переопределите многие методы в Backbone-relational, позвольте ему справиться с этой ситуацией. Моя первая мысль:

relations: [{
  collectionOptions: function(model){
    // I am not sure if I should use `this` to access my relation object 
    var relation = this;
    return {
      model: relation.relatedModel,
      url: function(){
        return relation.relatedModel.urlRoot + '?' + relation.collectionKey + '=' + model.id;
      }
    }
  }
}]
// This seems work, but it can not be inherent by other model
// And in this case parent will have am empty children list at beginning.    
// So parent.fetchRelated() won't fetch anything, I need call this url my self.

3, используйте только Backbone-Relational как Store, а затем используйте Collection для управления отношениями.

4, Некоторые другие магические способы или шаблоны или базовые рамки

Спасибо за помощь.

4b9b3361

Ответ 1

Вот решение, которое у меня есть в моем текущем проекте. Обратите внимание, что Project имеет много комментариев, событий, файлов и видео. Эти отношения и их обратные отношения определяются на этих моделях:

Entities.Project = Backbone.RelationalModel.extend({
    updateRelation: function(relation) {
        var id = this.get('id'),
            collection = this.get(relation);

        return collection.fetch({ data: $.param({ project_id: id }) });
    }
});

У меня есть конечная точка REST, настроенная для принятия параметров, которые действуют как последовательные предложения WHERE. Поэтому project.updateRelation('comments') отправит запрос на /comments?project_id=4. У меня есть еще одна логика на стороне сервера, чтобы отфильтровать материал, который пользователь не имеет права видеть. (Laravel back-end, кстати)