【问题标题】:Load but don't send embedded objects加载但不发送嵌入对象
【发布时间】:2012-11-06 18:38:52
【问题描述】:

假设你有以下模型:

App.Item = DS.Model.extend({
    owner: DS.belongsTo('App.Person', {embedded: true})
})

这意味着你可以加载这个嵌入的关联,但这也意味着如果你想为一个已经存在的人创建一个新的 Item,ember-data 也会为每个新的 item 嵌入 Person 对象。

是否可以让它加载嵌入的对象,但在创建关联时只发送 id?即改为发送:

{"item": {"owner_id": 5}}

编辑: 澄清一下,我希望 ember-data 加载嵌入式关系,但如果我设置 {embedded: true} 这段代码:

App.Item.createRecord({name: 'Something', owner: App.Person.find(1)});
// And a few moments later when App.Person.find(1) has loaded
App.store.commit()

它将发送以下json:

{ "item": {"name": "Something", owner: { id: 1, name: "whatever" }}

但我想要的是:

{ "item": {"name": "Something", owner_id: 1 }}

基本上,如果我设置 embedded = true ember-data 也会在您创建对象时嵌入关联。

【问题讨论】:

  • 想要的就是发生的事情。它不发送嵌入的对象。它只发送ID。我不确定此功能是否包含在最新版本的 ember-data 中。你用的是什么版本?
  • 我正在使用大约一个月前的 master 分支中的版本。显然,在最新版本中,他们删除了嵌入式加载选项,并计划稍后将其包含在内,请参阅:github.com/emberjs/data/pull/428。真是一团糟……

标签: ember.js ember-data


【解决方案1】:

如果我正确理解您的目标,您就不必指定{ embedded: true }。默认的 ember-data 行为是惰性的。

如果你使用的是active_model_serializers(我强烈推荐给你),你应该如下声明你的服务器端序列化器:

class ItemSerializer < ActiveModel::Serializer
  embed :ids, include: false
  #...
end

【讨论】:

  • 请查看我的编辑,我想急切地加载,但似乎启用该选项也会使 ember-data 发送完整的关系,而不仅仅是它们的 ID。
  • 迈克说得对;你需要删除{embedded: true}。这就是导致 ember-data 序列化所有者属性而不仅仅是 id 的原因。关于服务器端序列化:查阅 ember-data README 以了解“sideloading”;它显示了 JSON 应该是什么样子。 (或者只是按照 Mike 的建议使用 active_model_serializers。)
猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多