Backbone-relational:除非与外键相同,否则关联键不起作用

Pla*_*Ton 6 javascript coffeescript backbone.js backbone-relational

我正在尝试让骨干关系插件与任务和消息之间的关联起作用.(任务有很多消息).

从标准rails/activerecord站点提取信息,该站点具有task_id字段作为外键.

问题是,除非我在反向关系中将密钥设置为"task_id",否则骨干关系不会在任何消息上填充"消息"字段,但这意味着,当从任务模型访问任务时在消息模型中,task_id字段填充了实际的任务对象,而不是被覆盖的'task_id'整数.

我猜有一种简单的方法可以将task_id指定为用于确定父任务的外键,但是将键表示的对象放在另一个字段中(例如,消息对象上的'task')...但是我无法弄清楚如何.任何想法都赞赏.代码如下

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel
  paramRoot: 'task'

  relations: [{
    type: Backbone.HasMany,
    key: "messages",
    relatedModel: "Backbonescaffolddemo.Models.Message",
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection",
    includeInJSON: true
    reverseRelation: {
      key: "task_id"
      includeInJSON: true
    }
  }]
Run Code Online (Sandbox Code Playgroud)

小智 3

您也许可以使用keySourcekeyDestination来解决您的特定问题。

例子

在下面的示例中,假设我们从老式关系数据库获取数据,其中MonsterLoot_Item之间存在一对多关系。这种关系由Loot_Item表中的Monster_Id外键表示。我们还假设我们的 REST 服务不会为我们做任何花哨的数据嵌套,因为这似乎与您问题中的情况非常匹配。

密钥源

现在,让我们将“keySource”设置为我的外键(“Monster_Id”),并将“key”设置为我想要实际数据所在的属性的名称(例如“Monster”)。如果您中断调试器,您将在属性对象中看到实际上有一个名为“Monster”的字段,并且它确实指向怪物模型数据。嘿,酷!

includeInJSON

然而,如果你用 JSON 来处理那只小狗,你猜怎么着?它已经把所有的怪物数据都放在Monster_Id里了,就像你不想要的一样!嘎啊!我们可以通过将“includeInJSON”设置为“Monster_Id”来解决这个问题。现在,当它转换为 JSON 时,它将正确的 ID 放回到 Monster_Id 字段中,同时将数据序列化为 JSON,以发送到服务器。

问题解决了?呃,好吧,实际上,不一定……

注意:这一切听起来非常有用,但我在这种情况下发现了一个相当明显的问题。如果您使用的模板引擎(例如 Underscore.js 中的模板引擎)要求您将模型转换为 JSON,然后再将其传递到模板中,那么您将无权访问关系数据。遗憾的是,我们想要的消息 JSON 不一定与我们想要输入到模板中的 JSON 相同。