余烬数据关系一对多:良好实践?

时间:2017-04-13 14:25:40

标签: ember.js ember-data

我想知道我是否在我的ember应用程序中正确填充数据库。

基本上,我需要在点击按钮时导入大量书籍及其作者。为此,我创建了bookauthor模型。然后,在我的控制器中,我有一个动作addBook,我暂时只尝试添加一本书。

为简化起见,我认为一本书只有一位作者,但作者可以写多本书。 因此,这是一对多的关系。

以下是模型:

模型/ book.js

import Model from 'ember-pouch/model';
import DS from 'ember-data';

export default Model.extend({
  title: DS.attr('string'),
  author: DS.belongsTo('author')
});

模型/ author.js

import Model from 'ember-pouch/model';
import DS from 'ember-data';

export default Model.extend({
  name       : DS.attr('string'),
  books       : DS.hasMany('book')
});

在我的addBook操作中,我尝试了3件事来了解ember-data中的关系。

以下是我的三种方法的代码:

方法1:创建一本书并将其绑定到已在db中的作者

const book = this.store.createRecord('book',{
  title: this.get('titleinput'),
});

this.store.queryRecord('author',  {filter: {name: this.get('authorinput')}}).then((author) => {
  author.get('books').pushObject(book);
  book.save().then(() => author.save());
});

方法2:创建新书和新作者

const book = this.store.createRecord('book',{
  title: this.get('titleinput'),
});

let authorToStore = this.get('store').createRecord('author', {
  name: this.get('authorinput')
});

authorToStore.save().then(()=>{
  this.store.queryRecord('author',  {filter: {name: this.get('authorinput')}}).then((author) => {
    author.get('books').pushObject(book);
    book.save().then(() => author.save());
  });
});

方法3:创建一本书。然后,如果作者已经在数据库中,则将此书绑定到此作者。如果不是这样,请创建一个新作者并将其绑定到该书。

let authorPromise = new Promise((resolve, reject) => {
  let res;
  this.get('store').queryRecord('author', { filter: { name: this.get('authorinput') } }).then((author) => {
    if (author == null){
      res = this.get('store').createRecord('author', {
        name: this.get('authorinput'),
      });
    }
    else{
      res = author;
     }
    resolve(res);
  });
});

let bookToStore = this.get('store').createRecord('book', {
  title: this.get('titleinput')
});

authorPromise.then((author) => {
  bookToStore.save().then(()=>{
    this.store.queryRecord('book',  {filter: {title: this.get('titleinput')}}).then((book) => {
      author.get('books').pushObject(book);
      author.save().then(() => book.save());
    });
  });
});

这似乎是很多代码,特别是方法3 只是一个简单的关系。我这是推荐的方式吗?

也许在模型中执行所有操作然后将模型保存到商店会更简单?在这种情况下是否可能?

0 个答案:

没有答案