ember-data:使用多对多关系更新记录?

时间:2014-01-01 22:56:28

标签: ember.js ruby-on-rails-4 many-to-many ember-data

我有一个文件和标签模型,它们是多对多的关系:

App.File = DS.Model.extend
  name: DS.attr('string')
  tags: DS.hasMany('tag')

App.Tag = DS.Model.extend
  name: DS.attr('string')
  files: DS.hasMany('file')

我正在通过Rails后端生成JSON读取数据,到目前为止一切正常。我正在尝试在我的Ember路径中编写一个tagFile函数,用于标记具有特定标记的文件。这在ember端工作正常,但当然它不会持久,我无法弄清楚如何将正确的HTTP请求发送到Rails后端。所以我有

App.FilesRoute = Ember.Route.extend
  ...
  actions:
    tagFile: (file, tag) ->
      file.get('tags').pushObject(tag)
      tag.get('files').pushObject(file)
      # file.save() ? or something similar?

我尝试了file.save(),它发送了一个PUT请求,但Rails中发送的params哈希根本不包含Tag记录。我在ember-data内的updateRecord()方法中设置了断点,并在通过AJAX发送之前检查了data变量,此变量也不包括Tag记录。

发送HTTP请求(PUT或其他)的正确方法是什么,我可以将我的子记录传递到params哈希?有没有办法使用ember-data方法传递任意数据?我可以编写自己的AJAX调用,但似乎我没有利用余烬数据。任何见解?

使用:Ruby 2 / Rails 4后端,Ember 1.3.0-beta.1 + canary.48513b24,Ember-data 1.0.0-beta.4 + canary.c15b8f80

1 个答案:

答案 0 :(得分:1)

 file.get('tags').pushObject(tag);
 tag.save();
 file.save();

Dual hasMany会将它们连接在一起http://emberjs.jsbin.com/OxIDiVU/94/edit

如果要为其中一种类型创建自定义序列化程序以包含另一种类型。这是来自ED的略微修改的

App.FileSerializer = DS.RESTSerializer.extend({
   serialize: function(record, options) {
    var json = {};

    if (options && options.includeId) {
      var id = get(record, 'id');

      if (id) {
        json[get(this, 'primaryKey')] = get(record, 'id');
      }
    }

    record.eachAttribute(function(key, attribute) {
      this.serializeAttribute(record, json, key, attribute);
    }, this);

     var tags = [];
    record.eachRelationship(function(key, relationship) {
      if (relationship.kind === 'belongsTo') {
        this.serializeBelongsTo(record, json, relationship);
      } else if (relationship.kind === 'hasMany') {
        record.get(relationship.key).forEach(function(tag){
          tags.push(tag.toJSON());
        });
        //this.serializeHasMany(record, json, relationship);
      }
    }, this);

    json.tags = tags;

    return json;
  }
});

http://emberjs.jsbin.com/OxIDiVU/95/edit

或更具体的序列化程序

App.FileSerializer = DS.RESTSerializer.extend({
   serialize: function(record, options) {
    var json = {}, 
        tags=[];

    json.id = record.get('id'); 
    json.name = record.get('name');

    record.get('tags').forEach(function(tag){
      var tagJson = {};
      tagJson.id = tag.get('id');
      tagJson.name = tag.get('name');
      tags.push(tagJson);
    });

    json.tags = tags;

    return json;
  }
});

http://emberjs.jsbin.com/OxIDiVU/96/edit