Добре, аз не съм експерт по Ruby/Mongomapper, така че няма да мога да картографирам това в „модели“. Въпреки това, ако погледнете това от гледна точка на Mongo, ето как вероятно искате да изглеждат данните в Mongo.
Колекция: Категория
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Колекция :Продукти
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Така че това, което имате тук, е доста просто. Имате една колекция, която съдържа всички категории и подкатегории. Ако даден обект е „Подкатегория“, той ще има набор от полета „родител“. Ако няма поле "родител", тогава този обект е "Категория".
Всяка подкатегория има елемент "полета". "полета" всъщност е масив от двойки. Това ще улесни изобразяването. Ако някой въведе ретро автомобил, търсите категорията „ретро автомобил“ и след това преминавате през „полетата“, за да изобразите съответните полета за въвеждане. Използвах прости неща като "integer" и "boolean", но наистина можете да поставите каквото искате тук ("datepicker", "checkbox", ...) всичко зависи от вас.
Сега самият продукт основно съхранява препратка както към категорията, така и към подкатегорията. Той също така съхранява стойностите за всички полета, които сте въвели.
Така че продуктът разполага с всички необходими данни, което би трябвало да направи всеки продукт доста лесен за изобразяване. Заредете продукта и подходящата подкатегория и ще имате цялата необходима информация за динамично изобразяване на страницата.
РЕДАКТИРАНЕ
В отговор на коментара, „полетата“ в Категория може да се изгради с мерна единица:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]