【问题标题】:Save multiple model at once, in bulk一次保存多个模型,批量
【发布时间】:2016-01-29 23:28:30
【问题描述】:

我知道这个主题已经在 stackoverflow 和其他论坛上讨论过,但我找不到正确的方法。

我有一个名为“post”的模型,其中包含帖子信息(用户、描述等)。用户收到一些帖子,阅读它们并对其进行操作。当我请求 GET /api/posts/

时,这些帖子来自我的 api

我还有一个名为“post-state”的模型,我在其中保存人们阅读帖子的行为:当他们喜欢、分享、投票或收藏帖子时。

export default DS.Model.extend({
    post: belongsTo('post'),
    user: belongsTo('user'),
    liked: attr('boolean', { defaultValue: false }),
    favourited: attr('boolean', { defaultValue: false }),
    voted: attr('boolean', { defaultValue: false }),
    shared: attr('boolean', { defaultValue: false }),
});

我正在为我的 ember 应用程序寻找一种方法来批量保存我的后期状态模型,就像我批量接收帖子一样。帖子状态将通过 api 调用 POST /api/post-states/

保存

我在讨论中读到最好的方法是创建一个自定义适配器,但我不确定要在其中放入什么才能做到这一点......也许是创建一个函数saveAllRecords() ?

对我来说最好的解决方案是什么?

感谢您的帮助!

【问题讨论】:

  • 曾经看过这个:emberjs.com/api/data/classes/DS.Store.html#method_pushPayload 或者一个记录数组,你可以 .invoke('save') [不知道这是否全部通过一次推送。可能必须覆盖 store.scheduleSave]
  • 无论是通过 ED 模型还是通过自定义请求来设计 POST 请求负载主要取决于后端的能力,它是否可以原子批处理相关模型等。如果不能,仍然通过哈希或数组承诺可能会起作用,但结果可能会有所不同,具体取决于后端如何处理请求。可能的解决方案:emberjs.com/api/ember/3.7/modules/rsvp。这个问题需要澄清一些。

标签: javascript ember.js ember-data


【解决方案1】:

我环顾四周,似乎没有合适的方法来使用 Ember 做到这一点,但我想出了一些我不确定它是多少 Ember 方式的东西。您可以做的是创建一个包含 hasMany 属性的不同模型,该属性将包含您要批量保存的模型,然后将这些模型添加到容器模型中,您可以使用序列化器/适配器来获得您想要的.以下是它的工作原理:

模型(我们称之为post-state-container

import DS from 'ember-data';

export default DS.Model.extend({
  postStates: DS.hasMany('post-state')
});

序列化器

import DS from 'ember-data';
import Ember from 'ember';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    postStates: { embedded: 'always' },
  },
  serializeIntoHash: function(data, type, record, options) {
    Ember.$.extend(data, this.serialize(record, options));
  }
});

您可以在此处调整发送到服务器的有效负载以适合您的后端所需,因为您将从 this.serialize(record, options) 获得 JSON 格式的序列化 post-state 对象列表

适配器

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  namespace: 'api',
  urlForCreateRecord: function() {
    return this.get('namespace') + '/post-states';
  },
});

如何使用它(可能和某处的路由或控制器中的操作)

  let record1 = this.store.createRecord('post-state'); //These would be your populated records
  let record2 = this.store.createRecord('post-state'); //These would be your populated records
  let postStateContainer = this.store.createRecord('post-state-container');
  postStateContainer.get('post-state-container').pushObject(record1);
  postStateContainer.get('post-state-container').pushObject(record2);
  postStateContainer.save();

我已经对此进行了测试,并且可以正常工作。我不确定是否有更好的方法使用 JSONApi 或类似的东西

【讨论】:

    【解决方案2】:

    你可以看看ember-api-actions 是如何做到的。查看包含执行 ajax 调用方法的文件的 build-urlone。您基本上可以复制这些方法并在您的模型中使用它。但我认为此时只使用插件会更容易:)

    【讨论】:

    • 我查看了这个插件,但我并不喜欢它的构建方式,它并不能真正满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多