OK, jag är ingen Ruby/Mongomapper-expert, så jag kommer inte att kunna mappa detta till "modeller". Men om du tittar på detta ur Mongos perspektiv, så här vill du förmodligen att data ska se ut 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 här är ganska enkelt. Du har en samling som innehåller alla kategorier och underkategorier. Om ett objekt är en "underkategori" kommer det att ha ett "förälder"-fält. Om det inte finns något "förälder"-fält är det objektet en "Kategori".
Varje underkategori har ett "fält"-element. "fält" är faktiskt en array av par. Detta gör det enkelt att rendera. Om någon går in i en veteranbil slår du upp kategorin "vintagebil" och går sedan igenom "fälten" för att återge lämpliga inmatningsrutor. Jag använde enkla saker som "integer" och "boolean", men du kan verkligen lägga in vad du vill här ("datepicker", "checkbox", ...) det är upp till dig.
Nu lagrar själva produkten i princip en referens till både kategorin och underkategorin. Den lagrar också värdena för alla fält som du har angett.
Så produkten har all data den behöver, vilket borde göra varje produkt ganska lätt att rendera. Ladda produkten och lämplig underkategori så får du all information du behöver för att dynamiskt rendera sidan.
REDIGERA
Som svar på kommentaren, "fälten" i Kategori kan byggas med en måttenhet:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]