主干关系:除非关联键与外键相同,否则关联键不起作用



我试图获得与任务和消息之间的关联的骨干关系插件工作。(一个任务有许多消息)。

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

问题是,骨干关系不会用任务模型上的任何消息填充"消息"字段,除非我在反向关系中将键设置为"task_id"…但这意味着,当从Message模型访问任务时,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
    }
  }]

您可以使用keySource或keyDestination来解决您的特定问题。

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

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

<标题> includeInJSON h1> 而,如果你要json,你猜会发生什么?它把所有的怪物数据放在Monster_Id中,就像你不想要的那样!嗨!我们可以通过设置& includeInJSON"Monster_Id"帮助"。现在,当它被转换为JSON时,它将适当的ID放回Monster_Id字段,当它将数据序列化为JSON时,发送到服务器。

问题解决了吗?嗯,实际上,不一定

警告:这些听起来非常有用,但是我发现在这个场景中有一个相当明显的问题。如果您正在使用模板引擎(比如Underscore.js中的那个),它要求您在将模型传递到模板之前将其转换为JSON,哎呀——您无法访问您的关系数据。唉,我们想要的消息JSON不一定与我们想要提供给模板的JSON相同。

如果您希望消息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的"true"值表示对相关模型使用完整的JSON。

编辑:重读你的问题后,我不确定我的答案是否与你的问题有关。

我最初的答案是发布一个消息回服务器,你希望JSON是这样的:

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

我不确定你到底想要发生什么,但是骨干关系应该工作的方式是任务的消息集合将是完整模型的集合,所以你可以遍历它们并将它们传递给视图进行渲染等。

如果你想在模板或其他地方输出一个Message的id,那么你可以取Message模型的"id":

myTask.get('messages').first().id  ->  returns the first message's id

相关内容

  • 没有找到相关文章

最新更新