5

我对 EmberJS 还很陌生,晚上的大部分时间我都在摆弄,试图在我正在开发的新应用程序中坚持一些 hasMany 和多对多的关系。

我正在使用 Ember DataActiveModelAdapter将其连接到我正在使用的 rails 后端ActiveModelSerializers

我正在使用我正在使用的以下版本的 Ember 和 Ember Data。

DEBUG: -------------------------------
DEBUG: Ember      : 1.6.0-beta.1+canary.d0f5f254
DEBUG: Ember Data : 1.0.0-beta.7+canary.d5562867
DEBUG: Handlebars : 1.1.1
DEBUG: jQuery     : 1.10.2
DEBUG: ------------------------------- 

我遇到的基本问题是,在保存记录时,关联 ID 没有被发送回服务器。

我深入研究了ActiveModelSerializer 源,发现它跳过了 hasMany 序列化

var ActiveModelSerializer = RESTSerializer.extend({ // ...
  /**
    Does not serialize hasMany relationships by default.
  */
  serializeHasMany: Ember.K,
}

我提出了以下基本解决方案,到目前为止它正在工作,但我想知道是否有遵循 Ember 约定和最佳实践的更清洁的解决方案。

DS.ActiveModelAdapter.reopen
  namespace: 'api/v1'

App.Store = DS.Store.extend
  adapter: '-active-model'

App.ApplicationSerializer = DS.ActiveModelSerializer.extend
  serializeHasMany: (record, json, relationship) ->
    if relationship.options.async
      key = relationship.key
      data = record.get("data.#{key}")
      if data?
        json[@keyForRelationship(key, "hasMany")] = data.mapBy(Ember.get(this, "primaryKey"))
    return
4

1 回答 1

1

在我的理解中,活动模型序列化程序跳过的原因有很多关系是它希望后端处理它。在关系数据库中, a has many 的值没有显式保存在父记录上。将外键保存在孩子中就足够了。当您要求更清洁的解决方案时 - 也许ActiveModelSerializer不是最适合您的 API。

于 2014-09-12T10:40:04.617 回答