OK, ik ben geen Ruby/Mongomapper-expert, dus ik kan dit niet in "modellen" in kaart brengen. Als je dit echter vanuit het perspectief van Mongo bekijkt, is dit hoe je waarschijnlijk wilt dat de gegevens er in Mongo uitzien.
Collectie: Categorie
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Collectie :Producten
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Dus wat je hier hebt is vrij eenvoudig. U hebt één verzameling die alle categorieën en subcategorieën bevat. Als een object een "Subcategorie" is, heeft het een veld "ouder". Als er geen "bovenliggend" veld is, dan is dat object een "Categorie".
Elke subcategorie heeft een "fields"-element. "fields" is eigenlijk een array van paren. Dit maakt het gemakkelijk om te renderen. Als iemand een vintage auto betreedt, zoek je de categorie "vintage auto" op en loop je door de "velden" om de juiste invoervakken weer te geven. Ik gebruikte simpele dingen zoals "integer" en "boolean", maar je kunt hier echt alles invullen ("datepicker", "checkbox", ...), het is allemaal aan jou.
Nu slaat het product zelf in feite een verwijzing op naar zowel de categorie als de subcategorie. Het slaat ook de waarden op voor alle velden die je hebt ingevoerd.
Het product heeft dus alle gegevens die het nodig heeft, waardoor elk product vrij eenvoudig kan worden weergegeven. Laad het product en de juiste subcategorie en je hebt alle informatie die je nodig hebt om de pagina dynamisch weer te geven.
BEWERKEN
Als antwoord op de opmerking, de "velden" in Categorie kan worden gebouwd met een maateenheid:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]