OK, ich bin kein Ruby/Mongomapper-Experte, daher kann ich dies nicht in "Modelle" abbilden. Wenn Sie dies jedoch aus Mongos Perspektive betrachten, möchten Sie wahrscheinlich, dass die Daten in Mongo so aussehen.
Sammlung: Kategorie
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Sammlung :Produkte
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Also, was Sie hier haben, ist ziemlich einfach. Sie haben eine Sammlung, die alle Kategorien und Unterkategorien enthält. Wenn ein Objekt eine "Unterkategorie" ist, hat es einen "übergeordneten" Feldsatz. Wenn es kein "Eltern"-Feld gibt, dann ist dieses Objekt eine "Kategorie".
Jede Unterkategorie hat ein "Felder"-Element. "Felder" ist eigentlich ein Array von Paaren. Dies erleichtert das Rendern. Wenn jemand einen Oldtimer betritt, schlagen Sie die Kategorie "Oldtimer" nach und durchlaufen dann die "Felder", um die entsprechenden Eingabefelder zu rendern. Ich habe einfache Dinge wie "integer" und "boolean" verwendet, aber Sie können hier wirklich alles eingeben, was Sie wollen ("datepicker", "checkbox", ...), es liegt ganz bei Ihnen.
Jetzt speichert das Produkt selbst grundsätzlich einen Verweis auf die Kategorie und die Unterkategorie. Es speichert auch die Werte für alle Felder, die Sie eingegeben haben.
Das Produkt verfügt also über alle Daten, die es benötigt, wodurch jedes Produkt ziemlich einfach zu rendern sein sollte. Laden Sie das Produkt und die entsprechende Unterkategorie und Sie haben alle Informationen, die Sie zum dynamischen Rendern der Seite benötigen.
BEARBEITEN
Als Antwort auf den Kommentar, die "Felder" in Kategorie kann mit einer Maßeinheit erstellt werden:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]