Дискриминаторы мангуста, экземпляра документов



Мы используем унаследованные схемы с функцией дискриминатора Мангуста, которую мы реализовали в соответствии с документацией .



Через наш 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 Мангуста функция, которая может дать мне соответствующую модель для данного ключа дискриминатора, просматривая все известные подсхемы?

627   1  

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

    Ничего не найдено.