首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Backbone-relational:关联键不会起作用,除非它与外键相同

Backbone-relational:关联键不会起作用,除非它与外键相同
EN

Stack Overflow用户
提问于 2012-01-03 02:27:51
回答 2查看 2.5K关注 0票数 6

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

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

问题是,backbone-relational不会用任务模型上的任何消息填充' messages‘字段,除非我在反向relation...but中将键设置为" task_id“,这意味着,当从消息模型访问任务时,task_id字段填充的是实际的任务对象,而不是被覆盖的'task_id’整数。

我猜有一种简单的方法可以指定task_id作为外键来确定父任务,但是将这个键表示的对象放在不同的字段中(例如messages对象上的‘...but’),我不知道怎么做。任何想法都很感谢。下面的代码

代码语言:javascript
复制
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
    }
  }]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-22 05:13:35

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

示例

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

keySource

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

includeInJSON

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

问题解决了吗?呃,好吧,其实不一定。

警告:这一切听起来都非常有用,但我在这个场景中发现了一个相当明显的问题。如果您使用的模板引擎(例如Underscore.js中的模板引擎)要求您在将模型传递到模板之前将其转换为JSON,那么您将无法访问您的关系数据。遗憾的是,我们想要用于消息的JSON不一定与我们想要馈送到模板中的JSON相同。

票数 3
EN

Stack Overflow用户

发布于 2012-01-03 06:48:26

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

代码语言:javascript
复制
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是这样的:

代码语言:javascript
复制
{
  "message_title": "My Title",
  "message_body": "Blah blah blah...",
  "task_id": 12345
}

我不确定你到底希望发生什么,但是Backbone Relational的工作方式是,任务的消息集合将是完整模型的集合,所以你可以迭代它们并将它们传递给视图进行呈现,等等。

如果你想在一个模板中输出一个消息的id,那么你需要获取消息模型的"id":

代码语言:javascript
复制
myTask.get('messages').first().id  ->  returns the first message's id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8704093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档