OK, nie jestem ekspertem od Ruby/Mongomapper, więc nie będę w stanie zmapować tego na "modele". Jeśli jednak spojrzysz na to z perspektywy Mongo, oto jak prawdopodobnie chcesz, aby dane wyglądały w Mongo.
Kolekcja: Kategoria
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Kolekcja :Produkty
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Więc to, co tu masz, jest całkiem proste. Masz jedną kolekcję, która zawiera wszystkie kategorie i podkategorie. Jeśli obiekt jest „podkategorią”, będzie miał ustawione pole „rodzic”. Jeśli nie ma pola „rodzic”, to ten obiekt jest „Kategorią”.
Każda podkategoria posiada element „pola”. „pola” to właściwie tablica par. Ułatwi to renderowanie. Jeśli ktoś wejdzie do zabytkowego samochodu, wyszukasz kategorię „samochód zabytkowy”, a następnie przejdziesz przez „pola”, aby wyrenderować odpowiednie pola wprowadzania. Użyłem prostych rzeczy, takich jak "integer" i "boolean", ale naprawdę możesz tutaj umieścić, co chcesz ("datepicker", "checkbox", ...), wszystko zależy od Ciebie.
Teraz sam produkt zasadniczo przechowuje odniesienie zarówno do kategorii, jak i podkategorii. Przechowuje również wartości dla wszystkich wprowadzonych pól.
Tak więc produkt ma wszystkie potrzebne dane, co powinno sprawić, że każdy produkt będzie dość łatwy do renderowania. Załaduj produkt i odpowiednią podkategorię, a będziesz mieć wszystkie informacje potrzebne do dynamicznego renderowania strony.
EDYTUJ
W odpowiedzi na komentarz „pola” w Kategorii można zbudować za pomocą jednostki miary:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]