2017-06-10 1 views
1

J'essaye de construire mon modèle de listes d'une manière où il restreint les utilisateurs à sélectionner seulement une sous-catégorie si elle existe dans la liste de tableau parent. Je peux le faire lorsque je construis bien le point final de l'API, mais je voulais voir s'il était possible de le faire dans le modèle lui-même.Définir Enum Array basé sur un autre tableau Enum dans le même modèle - Mongoose

voici un exemple:

Si (un utilisateur sélectionne des ménages de catégorie parente du tableau de la catégorie ENUM mère) .alors (matricielleEnsemble ENUM en fonction de la catégorie parente)

Code de référence:

Modèle:

var categories = require(settings.PROJECT_DIR + 'controllers/data/categories'); 

var ListingSchema = mongoose.Schema({ 
    data: { 
     category: { 
      parent: { 
       type: String, 
       enum: categories.parent(), 
       required: true 
      }, 
      sub: { 
       type: String, 
       enum: categories.sub("household"), // should be this.data.category.parent instead of hard coded value 
       required: true 
      } 
     }, 
    } 
} 

Array Catégories:

module.exports.categories = [ 
    { "household" : ["repair", "carpentry", "housecleaning", "electrical", "handymen", "movers", "plumbing", "gardening/pool"] }, 
    { "automotive" : ["autobody", "mechanics", "towing"] }, 
    { "creative" : ["art", "cooking", "film", "graphic_design", "marketing", "music", "writing"] }, 
    { "tech"  : ["tech", "repair", "web_design", "web_development"] }, 
    { "events"  : ["artist", "florist", "musician", "photography", "planning", "venue"] }, 
    { "legal"  : ["accounting", "advising", "investments", "consulting", "real_estate"] }, 
    { "health"  : ["beauty", "fitness", "nutrition", "therapeutic"] }, 
    { "pets"  : ["grooming", "sitter", "trainer", "walker"] } 
]; 

// @returns parent categories 
module.exports.parent = function() { 
    var self = this; 
    var parentCategories = []; 

    for(var i in self.categories) { 
     parentCategories.push(Object.keys(self.categories[i])[0]); 
    } 

    return parentCategories; 
} 

// @returns sub categories based of parent input 
module.exports.sub = function(parent) { 
    var self = this; 
    var subCategories = []; 

    for(var i in self.categories) { 
     if(self.categories[i][parent]) { 
      return self.categories[i][parent]; 
     } 
    } 
} 

Répondre

1

Ce n'est pas possible dans le modèle. Les méthodes

mongoose.Schema() créent un objet Schéma en fonction du paramètre qui lui est fourni. Et l'objet créé est stocké dans ListingSchema. Puisque l'objet est créé la première fois que la méthode mongoose.Schema() est exécutée, vous ne pouvez pas modifier dynamiquement les valeurs après cela. Ce qui signifie que la valeur acceptée par enum ne peut pas être modifiée une fois qu'elle est définie.

La meilleure approche consiste à ajouter toutes les valeurs dans un seul tableau, puis à la définir comme valeur d'enum et à appliquer la restriction de sous-catégorie ailleurs.

+0

Je vois. Oui, j'ai fait la restriction par le biais de middleware en express à la place. – Shivam

+0

Autre chose que vous devez savoir? –