ОК, я не эксперт по Ruby / Mongomapper, поэтому я не смогу сопоставить это с "моделями".Однако, если вы посмотрите на это с точки зрения Монго, вот, как вы, вероятно, хотите, чтобы данные выглядели в Монго.
Коллекция: Категория
{"_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"},...]