2015-12-15 7 views
1

У меня есть к реляционным моделям, вопрос, который может иметь много Ответ:Как обновить соответствующие модели с шлейфом

Вот мой question.json:

{ 
    "name": "Question", 
    "base": "PersistedModel", 
    "idInjection": false, 
    "options": { 
    "validateUpsert": true 
    }, 
    "mysql": { 
    "schema": "metal-quizz", 
    "table": "Question" 
    }, 
    "properties": { 
    "id": { 
     "type": "Number", 
     "id": true, 
     "required": true, 
     "length": null, 
     "precision": 10, 
     "scale": 0, 
     "mysql": { 
     "columnName": "id", 
     "dataType": "int", 
     "dataLength": null, 
     "dataPrecision": 10, 
     "dataScale": 0, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    }, 
    "label": { 
     "type": "String", 
     "required": true, 
     "length": 255, 
     "precision": null, 
     "scale": null, 
     "mysql": { 
     "columnName": "label", 
     "dataType": "varchar", 
     "dataLength": 255, 
     "dataPrecision": null, 
     "dataScale": null, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    }, 
    "level": { 
     "type": "Number", 
     "required": true, 
     "length": null, 
     "precision": 10, 
     "scale": 0, 
     "mysql": { 
     "columnName": "level", 
     "dataType": "int", 
     "dataLength": null, 
     "dataPrecision": 10, 
     "dataScale": 0, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "answers": { 
     "type": "hasMany", 
     "model": "Answer", 
     "foreignKey": "questionId" 
    } 
    }, 
    "acls": [], 
    "methods": {} 
} 

Вот мой answer.json:

{ 
    "name": "Answer", 
    "base": "PersistedModel", 
    "idInjection": false, 
    "options": { 
    "validateUpsert": true 
    }, 
    "mysql": { 
    "schema": "metal-quizz", 
    "table": "Answer" 
    }, 
    "properties": { 
    "id": { 
     "type": "Number", 
     "id": true, 
     "required": true, 
     "length": null, 
     "precision": 10, 
     "scale": 0, 
     "mysql": { 
     "columnName": "id", 
     "dataType": "int", 
     "dataLength": null, 
     "dataPrecision": 10, 
     "dataScale": 0, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    }, 
    "questionId": { 
     "type": "Number", 
     "required": true, 
     "length": null, 
     "precision": 10, 
     "scale": 0, 
     "mysql": { 
     "columnName": "questionId", 
     "dataType": "int", 
     "dataLength": null, 
     "dataPrecision": 10, 
     "dataScale": 0, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    }, 
    "label": { 
     "type": "String", 
     "required": true, 
     "length": 255, 
     "precision": null, 
     "scale": null, 
     "mysql": { 
     "columnName": "label", 
     "dataType": "varchar", 
     "dataLength": 255, 
     "dataPrecision": null, 
     "dataScale": null, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    }, 
    "status": { 
     "type": "Number", 
     "required": true, 
     "length": null, 
     "precision": 3, 
     "scale": 0, 
     "mysql": { 
     "columnName": "status", 
     "dataType": "tinyint", 
     "dataLength": null, 
     "dataPrecision": 3, 
     "dataScale": 0, 
     "nullable": "N" 
     }, 
     "_selectable": false 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "question": { 
     "type": "belongsTo", 
     "model": "Question", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [], 
    "methods": {} 
} 

Я хотел бы иметь веб-страницу с формой, которая отображает вопрос и все связанные с ним ответы и позволяет мне обновлять их все одновременно. Мне удалось отобразить часть без каких-либо проблем, но я получаю орехи в части обновления.

В теории это возможно, так как я могу это сделать через Проводник по следующим маршрутам:

PUT /Questions/{id} to update question 
PUT /Questions/{id}/answers/{fk} to update answers individually 

Так что я создал удаленный метод, чтобы сделать это, но я не могу понять, какой метод ответов Я могу использовать их для их обновления один за другим:

Question.putWithDeps = function(question, cb) { 
    // Update Question 
    Question.upsert(question, function(err, model) { 
     // What code am I supposed to put here to update question.answers ??? 
    } 
}; 
Question.remoteMethod(
    'putWithDeps', 
    { 
     http: {path: '/withDeps', verb: 'put'}, 
     accepts: {arg: 'instance', type: 'object'}, 
     returns: {root: true, type: 'object' } 
    } 
); 

Я все ли ошибаюсь? Спасибо заранее.

+0

Что это вы пытаетесь достичь? Обновление сразу нескольких ответов с одинаковым значением? Или обновить много ответов, все с разными значениями все сразу? Почему бы не обновить их по одному, как API дает вам «из коробки»? Вы видели это: https://docs.strongloop.com/display/LB/PersistedModel+REST+API#PersistedModelRESTAPI-Updatematchingmodelinstances? – Jack

+0

Я хочу обновить их один за другим, поскольку они имеют разные значения, конечно. То, что мне интересно, это правильный способ сделать это: - мне нужно использовать методы модели ответа - мне нужно использовать модель экземпляра Question.answers Ссылка, которую вы указали, касается маршрутов, когда я пытаясь сделать это программно, я никогда не думал, что может быть хорошей практикой использовать маршруты в методах loopback remote ... не так ли? – Airzebeth

ответ

3

Это будет выглядеть примерно так (не точный код, просто грубый эскиз и не проверенный, точные аргументы, возможно, нуждаются в настройке). Кроме того, необходимо будет изменить свой удаленный метод для передачи в новом Ответ данных:

Question.putWithDeps = function(question, answers, cb) { 
    // Update Question 
    Question.upsert(question, function(err, question) { 

    // get all answers that belong to the parent question 
    question.answers({}, function(err, answers) { 

     // answers = array of answers that belong to the Question 
     // example with index 0: 
     answer[0].upsert({answer object}, function(err, answer) { 
     // check for err or success 
     }) 

     // or loop on the array and update inside the loop (or promisify using .then()) 

    }); 

    // could also destroy all answers and create all new ones 
    question.answers.destroyAll(function(err) { 

     question.answers.create(<array of new answers>,function(err) { 
     ... 
     }); 
    }); 

    } 
}; 

Отъезд hasMany документы, секция в нижней части показаны методы, добавленные в модель:

https://docs.strongloop.com/display/public/LB/HasMany+relations