OK, eu não sou um especialista em Ruby/Mongomapper, então não poderei mapear isso em "modelos". No entanto, se você olhar para isso da perspectiva do Mongo, veja como você provavelmente deseja que os dados apareçam no Mongo.
Coleção: Categoria
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Coleção :Produtos
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Então o que você tem aqui é bem simples. Você tem uma coleção que contém todas as categorias e subcategorias. Se um objeto for uma "Subcategoria", ele terá um campo "pai" definido. Se não houver um campo "pai", esse objeto será uma "Categoria".
Cada subcategoria tem um elemento "campos". "campos" é na verdade uma matriz de pares. Isso facilitará a renderização. Se alguém entrar em um carro antigo, você procura a categoria "carro vintage" e, em seguida, percorre os "campos" para renderizar as caixas de entrada apropriadas. Eu usei coisas simples como "integer" e "boolean", mas você pode realmente colocar o que quiser aqui ("datepicker", "checkbox", ...) tudo depende de você.
Agora, o próprio produto basicamente armazena uma referência tanto para a Categoria quanto para a Subcategoria. Ele também armazena os valores de todos os campos que você inseriu.
Portanto, o Produto tem todos os dados de que precisa, o que deve facilitar a renderização de cada produto. Carregue o Produto e a Subcategoria apropriada e você terá todas as informações necessárias para renderizar a página dinamicamente.
EDITAR
Em resposta ao comentário, os "campos" em Categoria pode ser construído com uma unidade de medida:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]