1

我有一个 Ember.js 应用程序 (1.0.0-rc.3) 使用 Ember Data (Rev 12) 持久保存到 Rails 后端。在客户端,我有两个具有一对多关系的模型:

App.Child = DS.Model.extend(
  name: DS.attr('string')
  parent: DS.belongsTo('App.Parent')

App.Parent = DS.Model.extend(
  name: DS.attr('string')
  children: DS.hasMany('App.Child')
)

我已将我的商店配置为期望来自 Rails 的 JSON 嵌入关系而不是旁加载它们:

App.Store = DS.Store.extend(
  revision: 12
  adapter: DS.RESTAdapter.extend(serializer: DS.RESTSerializer.extend(init: ->
    @_super()
    @map "App.Child",
      parents:
        embedded: "always"

  ))
)

然后我有一个创建新App.Child记录的表格。在新App.Child表单视图的 childNewController 中,我创建了一个新的App.Child和一个新App.Parent的,如下所示:

@transaction = @get('store').transaction()
@set('content', @transaction.createRecord(App.Child, {}))
@set('content.parent', @transaction.createRecord(App.Parent, {}))

我有绑定到孩子和父母的各种属性的文本字段。当我单击表单上的保存按钮时,childNewController 中的一个操作会使用@transaction.commit().

问题

当事务提交时,Rails 会收到两个 JSON POST 请求——一个发送给 ParentController 的 JSON 格式如下:

{"parent"=>{"name"=>"William"}}

...以及使用 JSON 向 ChildController 发送第二个 POST,如下所示:

{"child"=>{"name"=>"Henry", "parent"=>{"name"=>"William"}}}

现在 Rails ChildController 和 ParentController 都在尝试保存新的父级。

理想情况下,对 ParentController 的请求会消失,因为我不想要它,并且它缺乏足够的信息来建立与孩子的关系。我会简单地忽略对 ParentController 的请求,但 Ember Data 期待来自服务器的响应。

另一种选择是让 ParentController 保存新的父记录,然后 ChildController 可以查找新保存的父记录并创建与新子记录的链接。问题是这两个请求的顺序是不可预测的。

由于这个顺序问题,我尝试放入Parent.find_or_create_by_name(parent_name)两个 Rails 控制器,理论上如果一个控制器已经创建了新的父级,另一个控制器只会执行对该新父级记录的查找。但是,这导致了重复的父记录!

我真的不明白为什么 Ember Data 坚持将父级的重复 JSON 表示推送到后端。我确信这是我的一个简单的配置错误。

更新

我现在通过链接提交找到了一个可接受的解决方法:

newParent = @transaction.createRecord(App.Parent, {name: parentName})
currentChild = @get('content')  # we assigned a new App.Child to the childNewController in the new child route's controller setup
currentStore = @get('store')

newParent.one('didCreate', this, ->
  now = new Date()
  transaction = currentStore.transaction()
  transaction.add currentChild
  transaction.commit()
  transaction = null
)
newParent.get('transaction').commit()
@transaction = null

有一个更好的方法吗?

4

0 回答 0