OK, jeg er ikke en Ruby/Mongomapper-ekspert, så jeg vil ikke være i stand til at kortlægge dette i "modeller". Men hvis du ser på dette fra Mongos perspektiv, er det sådan, du sandsynligvis vil have, at dataene skal se ud i Mongo.
Samling: Kategori
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Samling :Produkter
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Så det du har her er ret simpelt. Du har én samling, der indeholder alle kategorier og underkategorier. Hvis et objekt er en "Underkategori", vil det have et "overordnet" feltsæt. Hvis der ikke er noget "overordnet" felt, så er det objekt en "Kategori".
Hver underkategori har et "felter"-element. "felter" er faktisk en række par. Dette vil gøre det nemt at gengive. Hvis nogen kører ind i en veteranbil, slår du op i kategorien "vintagebil" og går derefter gennem "felterne" for at gengive de relevante inputfelter. Jeg brugte simple ting som "integer" og "boolean", men du kan virkelig sætte hvad du vil her ("datepicker", "checkbox", ...), det er helt op til dig.
Nu gemmer selve produktet som udgangspunkt en reference til både Kategori og Underkategori. Den gemmer også værdierne for alle de felter, du har indtastet.
Så produktet har alle de data, det har brug for, hvilket burde gøre hvert produkt ret nemt at gengive. Indlæs produktet og den relevante underkategori, og du vil have alle de oplysninger, du har brug for til dynamisk at gengive siden.
REDIGER
Som svar på kommentaren, "felterne" i Kategori kan bygges med en måleenhed:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]