一次批量保存多个模型

Save multiple model at once, in bulk

本文关键字:保存 模型 一次      更新时间:2023-09-26

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

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

。我

还有一个名为"后状态"的模型,我在其中保存阅读帖子的人的操作:当他们喜欢、分享、投票或喜欢帖子时。

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 }),
});

我正在寻找一种方法,让我的余烬应用程序批量保存我的后状态模型,就像我批量接收帖子的方式一样。 帖子状态将使用 api 调用 POST /api/post-states/

保存

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

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

谢谢你的帮助!

我环顾四周,似乎没有合适的方法可以用 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 或类似的东西

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