首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将外键保存到具有hasMany关系的其他模型

将外键保存到具有hasMany关系的其他模型
EN

Stack Overflow用户
提问于 2013-03-28 21:33:01
回答 1查看 1.5K关注 0票数 2

我遇到了以下问题。

在我的应用程序中,我有一个屏幕来制作一个新的Site。但是,当我通过控制器上的action保存新站点时,languages-property不会随POST-request一起发送到服务器。

用于添加新站点的模板如下:

代码语言:javascript
复制
<form class="form-horizontal">
<div class="control-group">
    <label class="control-label" for="name">Name</label>
    <div class="controls">
        {{view Ember.TextField valueBinding="name"}}
    </div>
</div>
<div class="control-group">
    <label class="control-label" for="languages">Languages</label>
    <div class="controls">
        {{view Ember.Select contentBinding="controllers.languages" selectionBinding="languages" optionValuePath="content.id" optionLabelPath="content.description" multiple="true"}}
            </div>
</div>
<div class="form-actions">
    <button {{ action "createSite" }} class="btn btn-primary">Save</button>
</div>

我这样定义我的Store

代码语言:javascript
复制
App.Store = DS.Store.extend({
    revision : 12,
    adapter : DS.RESTAdapter.extend({
        namespace : 'rest'
    })
});

这是我的控制器:

代码语言:javascript
复制
App.SitesNewController = Em.ObjectController.extend({
    needs: ['languages'],
    name: null,
    languages: null,
    createSite : function() {
        var self = this;
        var name = this.get('name');
        var languages = this.get('languages');
        // Create the new Site model
        var s = App.Site.createRecord({
            name : name
        });
        $.each(languages,function(i,lang) {
            s.get('languages').addObject(lang);
        });

        this.get('store').commit();
    }
});

这是Site-model

代码语言:javascript
复制
App.Site = DS.Model.extend({
    name : DS.attr('string'),
    languages : DS.hasMany('App.Language')
});

Language-model:

代码语言:javascript
复制
App.Language = DS.Model.extend({
    description : DS.attr('string')
});

发送到我的服务器的POST-request数据如下:

代码语言:javascript
复制
{
  "site":{"name":"test"}
}

所以我很怀念language-property。实际上,我需要一个带有id数组的language_ids属性。

当我像这样编辑我的RESTAdapter-configuration时:

代码语言:javascript
复制
DS.RESTAdapter.map('App.Site', {
    languages: { embedded: 'always' }
});

现在,POST-request数据为:

代码语言:javascript
复制
{
  "site": {
    "name":"test",
    "languages":[{
      "id":2,"description":"English"
    },{
      "id":3,"description":"Deutsch"
    }]
  }
}

语言已知嵌入在请求数据中。这是没有问题的,在后台,我会在保存之前得到id。但要知道它希望language-data也嵌入到GET-responses中。

在后期数据中只发送id的方法是什么?我希望是这样的:

代码语言:javascript
复制
{
  "site": {
    "name":"test",
    "languages":[2,3]
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 03:17:02

这个答案很大程度上来自于this other StackOverflow answer

代码语言:javascript
复制
App.Store = DS.Store.extend({
    revision : 12,
    adapter : DS.RESTAdapter.extend({
        namespace : 'rest',
        serializer: DS.RESTSerializer.extend({
            addHasMany: function (hash, record, key, relationship) {
                var type = record.constructor,
                    name = relationship.key,
                    serializedHasMany = [], 
                    manyArray, embeddedType;

                embeddedType = this.embeddedType(type, name);
                if (embeddedType !== 'always') { return; }

                manyArray = record.get(name);

                manyArray.forEach(function (record) {
                    serializedHasMany.push(record.get('id'));
                }, this);

                hash[this.singularize(key) + '_ids'] = serializedHasMany;
            }

        })

    })
});

作为参考,您可以查看RESTSerializer主要继承自的JSONSerializer。可以在here中找到addHasMany所做的代码。

请注意,对于上面的代码片段,唯一不同的是最后几行。不是序列化嵌入的记录,而是将ids推送到单个键下的散列中(如果不是have its own check for embedded types,我就会使用RESTSerializer#keyForHasMany

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15683273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档