Ember 数据多级层次结构始终嵌入

Posted

技术标签:

【中文标题】Ember 数据多级层次结构始终嵌入【英文标题】:Ember data multi level hierarchy with embedded always 【发布时间】:2013-01-31 12:10:58 【问题描述】:

我可以始终将嵌入式用于一级,但无法将其用于两级深度模型。急需帮助

App.Post = DS.Model.extend(
  title: DS.attr("string")
  comment: DS.belongsTo("App.Comment")
)

App.Comment = DS.Model.extend(
  text: DS.attr("string")
  ferment: DS.belongsTo("App.Ferment") 
)

App.Ferment = DS.Model.extend(
  fermenter: DS.attr("string")
)

App.Adapter.map App.Post,
  'comment':
    embedded: "always"


App.Adapter.map App.Comment,    
  ferment :
    embedded: "always"

# -----------------------------
App.store = App.Store.create(
  adapter: App.Adapter.create()
)
# -----------------------------

App.store.adapter.load App.store, App.Post,
  id: 12
  comment: text: "blabla", ferment:fermenter:'abcd'

console.log App.Post.find(12).get("comment.text")
console.log App.Post.find(12).get("comment.ferment.fermenter")

我得到了 comment.text 的日志作为 blabla 但不能让第二部分工作。 我正在使用 Ember 数据存储的第 11 版。 任何有类似问题/解决方案的人。

有趣的是,我们尝试了 hasMany 所以发布 -hasMany-> 评论,评论 -hasOne-> 发酵。这工作正常,这是代码。

App.Post = DS.Model.extend(
  title: DS.attr("string")
  comments: DS.hasMany("App.Comment")
)

App.Comment = DS.Model.extend(
  text: DS.attr("string")
  ferment: DS.belongsTo("App.Ferment")
)

App.Ferment = DS.Model.extend(
  fermi: DS.attr("string")
)

App.Adapter.map App.Post,
  comments:
    embedded: "always"

App.Adapter.map App.Comment,
  ferment:
    embedded: "always"

App.store = App.Store.create(
  adapter: App.Adapter.create()
)

# App.store.adapter.serializer.configure(App.Comment,
#   sideloadAs: 'comments' 
# )
App.store.adapter.load App.store, App.Post,
  id: 12
  comments: [text: "blabla", ferment:fermi: "found fermi"]

console.log App.Post.find(12).get("comments.firstObject.text")
console.log App.Post.find(12).get("comments.firstObject.ferment.fermi")

【问题讨论】:

我想我需要编写侧载映射,谁能帮我写这个。 有人回答会很棒。!!!无法将参数作为选项传递给 JSONtransforms,几乎陷入困境的唯一出路是编写映射器。 【参考方案1】:

ember-rails 中仍有一些错误修复: 我们因功能而受苦

extractEmbeddedBelongsTo: function(loader, relationship, data, parent, prematerialized)     
var reference = this.extractRecordRepresentation(loader, relationship.type, data, true);
prematerialized[relationship.key] = reference;

// If the embedded record should also be saved back when serializing the parent,
// make sure we set its parent since it will not have an ID.
var embeddedType = this.embeddedType(parent.type, relationship.key);
if (embeddedType === 'always') 
  reference.parent = parent;

BelongsTo 关系正在跳过嵌入对象的提取。错误的在这里:

extractEmbeddedBelongsTo: function(loader, relationship, data, parent, prematerialized) 
var reference = loader.sideload(relationship.type, data);
prematerialized[relationship.key] = reference;

// If the embedded record should also be saved back when serializing the parent,
// make sure we set its parent since it will not have an ID.
var embeddedType = this.embeddedType(parent.type, relationship.key);
if (embeddedType === 'always') 
  reference.parent = parent;

【讨论】:

以上是关于Ember 数据多级层次结构始终嵌入的主要内容,如果未能解决你的问题,请参考以下文章

使用Django ORM查询如何注释是不是存在多级外键层次结构

具有虚拟性的多级层次结构可防止转换函数指针

多级测试类层次结构中的 Spring @ContextHierarchy(使用 Scala 和 ScalaTest)

多叉树结合JavaScript树形组件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法)

Ember 计算属性在绑定到深度嵌套的属性时不会触发

Gradle目录结构