我想知道我是否在我的ember应用程序中正确填充数据库。
基本上,我需要在点击按钮时导入大量书籍及其作者。为此,我创建了book
和author
模型。然后,在我的控制器中,我有一个动作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 只是一个简单的关系。我这是推荐的方式吗?
也许在模型中执行所有操作然后将模型保存到商店会更简单?在这种情况下是否可能?