骨干关系有很多最佳实践

时间:2013-04-11 16:46:54

标签: backbone.js foreign-key-relationship has-many backbone-relational

我是Backbone-relational的新手,我不确定使用HasMany的正确方法是什么。

我有一个Parent模型,其中有许多children(“很多”我指的是数千名儿童)。为了避免性能问题,我使用外键/child/?parent=1查询子项,而不是在child_ids中创建一个巨大的Parent列表。但似乎这不是Backbone关系工作的方式。

所以我想知道处理这个问题的正确方法是什么。

1,将我的json api更改为包含父ID中的子ID列表,然后发送数千个ID作为Backbone-relational推荐:

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作为商店,然后使用Collection来管理关系。

4,其他一些神奇的方式或模式或骨干框架

感谢您的帮助。

1 个答案:

答案 0 :(得分: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后端,顺便说一句)