Ember.js & Ember Data: cómo crear un registro con la relación hasMany cuando el padre y el hijo aún no existen
Como parece ser el caso con casi todo lo que hago con datos de ascuas, el caso de prueba simple es muy simple, pero cualquier cosa "real" se desmorona rápidamente debido a mi falta de comprensión (y creo que la documentación). En el caso más simple, no tengo problemas para crear un nuevo registro y guardarlo en mi API REST. Usaré el ejemplo de la canasta de frutas predominante y comenzaré simplemente guardando una nueva pieza defruit
.
// Here is our fruit model
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
});
// This is easy to create and save
var fruit = this.store.createRecord('fruit', {
name: 'apple',
color: 'red'
});
fruit.save().then(successCallback, errorCallback);
Vale, no tengo ningún problema aquí. Conceptualmente tiene sentido, ¡el código está limpio y las cosas se ven muy duras! Ahora supongamos que tenemos unbasket
modelo y quebasket
modelo puede contener muchosfruit
. Además, el usuario puede crear nuevosfruit
y agregarlo a un nuevobasket
que aún no se ha creado en un paso desde la interfaz de usuario.
Así que aquí están los nuevos modelos:
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
basket: DS.belongsTo('basket')
});
module.exports = App.Basket = DS.Model.extend({
fruits: DS.hasMany('fruit', {async:true})
});
Dado lo anterior, digamos que el usuario ingresa dos nuevas frutas que actualmente no existen en la tienda o en la API REST del backend, las agrega a su nueva cesta (que tampoco existe todavía) y luego presiona 'guardar' .
¿Cómo se crea este registro con Ember Data? Esperaba que pudieras hacer algo como esto:
var newFruits = Ember.A();
newFruits.pushObject(this.store.createRecord('fruit', {
name: 'orange',
color: 'orange'
}));
newFruits.pushObject(this.store.createRecord('fruit', {
name: 'banana',
color: 'yellow'
}));
var basket = this.store.createRecord('basket', {
fruits: newFruits
});
basket.save().then(successCallback, errorCallback);
Desafortunadamente, esto no parece funcionar. Cuando miro los datos de solicitud POST en el inspector de Chrome, elfruits
La propiedad de la cesta siempre está vacía. Básicamente, la solicitud termina buscando esto:
{
basket: {
fruits: []
}
}
¿Estoy usando el patrón correcto para crear el registro 'cesta'? Espero no tener que terminar guardando cada pieza de fruta antes de guardar la canasta, ya que parece un desperdicio enviar 3 solicitudes POST cuando 1 sería suficiente. Además, ¿qué sucede cuando el usuario quiere crear 10 piezas de fruta? Eso sería 11 solicitudes POST.
¿Existe una práctica estándar para lograr lo anterior? Esencialmente, ¿cómo se crea un nuevo registro con una relación hasMany (cesta) donde los registros en la relación hasMany también son nuevos (la fruta).
¡Gracias!
Aquí están las versiones que estoy usando:
-------------------------------
Ember : 1.3.2+pre.25108e91
Ember Data : 1.0.0-beta.7+canary.238bb5ce
Handlebars : 1.3.0
jQuery : 2.0.3
-------------------------------