6

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

信息是从标准 rails/activerecord 站点中提取的,该站点有一个 task_id 字段作为外键。

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

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

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
    }
  }]
4

2 回答 2

3

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

例子

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

关键来源

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

包含InJSON

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

问题解决了?呃,嗯,其实,不一定……

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

于 2012-05-21T21:13:34.687 回答
0

如果您希望消息 JSON 中的“task_id”是 id,而不是任务的完整 JSON,则将“includeInJSON”设置为任务的 ID 属性(“task_id”)

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: "task_id"
    }
  }]

includeInJSON 的“真”值表示对相关模型使用完整的 JSON。

编辑:重新阅读您的问题后,我不确定我的回答是否与您的问题有关。

我最初的答案是将消息发布回您希望 JSON 类似于以下内容的服务器:

{
  "message_title": "My Title",
  "message_body": "Blah blah blah...",
  "task_id": 12345
}

我不确定您到底希望发生什么,但是 Backbone Relational 应该工作的方式是任务的消息集合将是完整模型的集合,因此您可以遍历它们并将它们传递给渲染视图等

如果您想在模板或其他东西中输出消息的 id 之一,那么您将采用消息模型的“id”:

myTask.get('messages').first().id  ->  returns the first message's id
于 2012-01-02T22:48:26.457 回答