【发布时间】:2012-03-11 19:46:07
【问题描述】:
假设我有一个包含两个集合的应用程序:Users 和 Tasks。这些之间存在多对多关联——一个任务可以与任意数量的用户关联,反之亦然。处理新关联的最佳方式是什么?
一种方法是为每个用户分配一个新的任务集合:
Users = Backbone.Model.extend({
this.tasks = new Tasks;
...
});
然后使用模型(或副本)作为输入执行this.tasks.create()。
这样做的问题是任务应该已经有一个ID。如果模型有 id,Backbone 想要进行更新。所以不是这样的:
POST /users/156/tasks
你会得到这样的东西:
PUT /users/156/tasks/15
这不是你想要的。您可以为该模型重新定义 isNew() 函数以让 Backbone 执行 POST,但这似乎是一种 hack。
另一种方法是在两端维护一个 id 列表。例如,User 模型 JSON 可能如下所示:
{
username: "jsmith"
name: "Joe Smith"
tasks: [5, 15, 256]
}
只需从要添加的模型中获取 ID,然后对用户执行 PUT。
这里的问题是更多的数据是通过网络发送的,而具体的变化没有体现出来。服务器必须做更多的工作来过滤模型,找出改变了什么,并根据需要添加/删除关联(这里的后端是 SQL,所以我们不只是处理嵌入式任务列表或任何东西)。请求所需的特定关联更改似乎要好得多。
那么哪种方法看起来最好呢?还有其他我没有考虑的选择吗?
(注意:我想避免像 Backbone-relational 这样的 Backbone 扩展)
【问题讨论】:
-
您可以保持无状态,只需使用 options.data 哈希获取每次使用的任务集合。
-
我不确定我是否理解为什么创建一个任务时会有一个 id
-
这一切都取决于你用它做什么,取决于你绑定到的事件,在某些事件上执行的代码,如果你有一个集合作为每个的子参数,可能会影响性能用户,虽然我没有确凿的数据。我想知道为什么选择避免骨干关系?
-
@Uzi 任务有 ids,在这个示例所基于的应用程序中,因为它们都已被持久化到服务器。
-
@Sander 骨干关系 看起来它引入了相当多的额外复杂性和魔力;我想避免为其他开发人员(和我自己)引入另一个障碍来理解该应用程序。