我有一个 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
有一个更好的方法吗?