Дискриминаторы мангуста, экземпляра документов
Мы используем унаследованные схемы с функцией дискриминатора Мангуста, которую мы реализовали в соответствии с документацией .
Через наш REST API мы хотим POST документы различных типов и обрабатывать логику с помощью общей функции контроллера.
Предположим, что у нас есть метод REST для создания документа, который может быть либо супертипом
GenericEvent, либо подтипом ClickedLinkEvent, либо SignedUpEvent (чтобы следовать примеру из документов, связанных выше). Чем я сейчас занимаюсь это что-то вроде: var GenericEventModel = require('GenericEventModel');
var ClickedLinkEventModel = require('ClickedLinkEvent');
var SignedUpEventModel = require('SignedUpEvent');
// REST logic for creating a document of a specific type
module.exports.createEvent = function(req, res, next) {
var modelType = req.params.type; // as provided via REST parameter
var Model = getModel(modelType); // get the appropriate model type
new Model(req.body).save(next);
}
// TODO want to avoid this
function getMongooseModel(type) {
switch (modelType) {
case 'GenericEvent': return GenericEventModel;
case 'ClickedLinkEvent': return ClickedLinkEventModel;
case 'SignedUpEvent': return SignedUpEventModel;
// and many more, needs to be extended, every time a new type is added …
}
}
Необходимость вручную курировать функцию
getMongooseModel всякий раз, когда добавляется новый тип модели, кажется довольно подверженной ошибкам, и я подозреваю, что другие люди, которые будут работать над кодом, просто забудут об этом.Итак, мой вопрос: существует ли в API Мангуста функция, которая может дать мне соответствующую модель для данного ключа дискриминатора, просматривая все известные подсхемы?
1 ответ:
Лучшей реализацией должно быть использование объекта вместо переключателя.
var modelMap = { 'GenericEvent': GenericEventModel, 'ClickedLinkEvent': ClickedLinkEventModel, 'SignedUpEvent': SignedUpEventModel }; function getMongooseModel(type) { return modelList[type]; }После этого во избежание ошибок вы можете использовать Mongoose#plugin(fn, [opts]) для заполнения объекта
modelMap.Или вы можете просто использовать Мангуст#модель(имя, [схема], [коллекция], [skipInit]) .
Определяет модель или извлекает ее.
Что-то вроде этого должно сработать:
module.exports.createEvent = function(req, res, next) { var Model = mongoose.model(req.params.type); (new Model(req.body)).save(next); }С правильным объявлением класса модели в Мангуст, имя модели должно соответствовать вашему параметру запроса, конечно.
var GenericEventModel = mongoose.model('GenericEvent', GenericEventModelSchema);
Comments