OK, non sono un esperto di Ruby/Mongomapper, quindi non sarò in grado di mapparlo in "modelli". Tuttavia, se guardi questo dal punto di vista di Mongo, ecco come probabilmente vorresti che i dati appaiano in Mongo.
Collezione: Categoria
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Collezione :Prodotti
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Quindi quello che hai qui è piuttosto semplice. Hai una raccolta che contiene tutte le categorie e le sottocategorie. Se un oggetto è una "Sottocategoria", avrà un set di campi "genitore". Se non è presente un campo "genitore", l'oggetto è una "Categoria".
Ogni Sottocategoria ha un elemento "campi". "campi" è in realtà una matrice di coppie. Questo renderà facile il rendering. Se qualcuno entra in un'auto d'epoca, si cerca la categoria "auto d'epoca" e quindi si scorre attraverso i "campi" per visualizzare le caselle di input appropriate. Ho usato cose semplici come "intero" e "booleano", ma puoi davvero mettere quello che vuoi qui ("datepicker", "checkbox", ...) dipende tutto da te.
Ora il prodotto stesso memorizza sostanzialmente un riferimento sia alla categoria che alla sottocategoria. Memorizza anche i valori per tutti i campi che hai inserito.
Quindi il Prodotto ha tutti i dati di cui ha bisogno, il che dovrebbe rendere ogni prodotto abbastanza facile da renderizzare. Carica il Prodotto e la Sottocategoria appropriata e avrai tutte le informazioni necessarie per il rendering dinamico della pagina.
MODIFICA
In risposta al commento, i "campi" in Categoria può essere costruito con un'unità di misura:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]