backbone.js - 以RESTful方式处理模型关系

时间:2011-08-25 23:16:37

标签: javascript orm model backbone.js relationship

我正在使用backbone.js

例如,假设我们有一个“产品”模型和一个具有多对多关系的“类别”模型。在我的一个观点中,我需要检索所有类别的列表,并知道每个类别是否与当前产品模型相关。

我是否设置了一个“类别”集合并让它成为我的模型的属性,并以某种方式让它访问模型的ID,以便在获取它时,它只获取相关的类别?然后我可以获取所有类别并交叉检查它们以查看哪些类别相关,同时仍然具有哪些类别?

我不知道最好的办法是什么。我习惯使用ORM,这样可以在服务器端轻松实现。

4 个答案:

答案 0 :(得分:13)

答案 1 :(得分:5)

有一个简单的&可自定义的解决方案,虽然它可能不如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'
  }
});

答案 2 :(得分:1)

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

答案 3 :(得分:0)

假设您在后端使用连接表:

创建包含连接表中所有行的集合和模型,并将以下方法添加到集合中: productsByCategory categoriesByProduct (使用 [join collection] .where(...) 。)

Backbone中的数据在后端镜像您的数据似乎有助于简化操作,在设置URL时您不必做任何复杂的事情。