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

Backbone.js - управление отношениями модели RESTful

Я использую backbone.js

Например, предположим, что у нас есть модель "продуктов" и модель "категории", которые имеют отношение "многие ко многим". В одном из моих представлений скажу, что мне нужно получить список всех категорий и узнать, связаны ли они с текущей моделью продукта.

Установил ли я коллекцию "категория" и был ли она свойством моей модели и каким-то образом предоставил ей доступ к идентификатору модели, чтобы при ее получении она получала только связанные категории? И тогда я мог бы получить все категории и перекрестно изучить их, чтобы увидеть, какие из них связаны, но все еще есть те, которые не являются?

Я понятия не имею, каким будет лучший способ сделать это. Я привык использовать ORM, который упрощает работу на стороне сервера.

4b9b3361

Ответ 2

Для него есть простое и настраиваемое решение, хотя оно может быть не столь надежным, как backbone-relational.

Backbone.ModelWithRelationship = Backbone.Model.extend({
  mappings: {},

  set: function(attributes, options) {
    _.each(this.mappings, function(constructor, key) {
      var RelationshipClass = stringToFunction(constructor);
      var model = new RelationshipClass();

      /* New relational model */
      if (!this.attributes[key]) {  
        this.attributes[key] = (model instanceof Backbone.Collection) ? model : null;
      }

      /* Update relational model */
      if (attributes[key] && !(attributes[key] instanceof Backbone.Model || attributes[key] instanceof Backbone.Collection)) {
        if (model instanceof Backbone.Model) {
          this.attributes[key] = model;
          this.attributes[key].set(attributes[key], options);           
        } else if (model instanceof Backbone.Collection) {
          this.attributes[key].reset(attributes[key], options);         
        }

        delete attributes[key];
      } 
    }, this);

    return Backbone.Model.prototype.set.call(this, attributes, options);
  }
});

Вы можете объявить отображение, просто создав подкласс Backbone.ModelWithRelationship.

Models.Post = Backbone.ModelWithRelationship.extend({
  mappings: {
    'comments': 'Collection.CommentCollection',
    'user': 'Models.User'
  }
});

Ответ 3

http://pathable.github.com/supermodel/ - это фантастика. Это позволяет вам делать такие вещи, как:

Post.has().many('comments', {
  collection: Comments,
  inverse: 'post'
});

Comment.has().one('post', {
  model: Post,
  inverse: 'comments'
});

var post = Post.create({
  id: 1,
  comments: [{id: 2}, {id: 3}, {id: 4}]
});

post.comments().length; // 3
var comment = Comment.create({id: 5, post_id: 1});
post.comments().length; // 4
comment.post() === post; // true :D

Ответ 4

Предполагая, что вы используете таблицу соединений на сервере:

Создайте коллекцию и модель, содержащую все строки в вашей таблице соединений, и добавьте в коллекцию следующие методы: productsByCategory и categoriesByProduct (используя [присоединиться к коллекции ].гд (...)).

Имея данные в зеркальном отражении базы данных, ваши данные в бэкэнд, похоже, помогают упростить процесс, и при настройке URL-адресов вам не придется ничего осложнять.