Oke, saya bukan ahli Ruby/Mongomapper, jadi saya tidak akan bisa memetakan ini ke dalam "model". Namun, jika Anda melihat ini dari sudut pandang Mongo, beginilah tampilan data yang mungkin Anda inginkan di Mongo.
Koleksi: Kategori
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Koleksi :Produk
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Jadi apa yang Anda miliki di sini cukup sederhana. Anda memiliki satu koleksi yang berisi semua Kategori dan Subkategori. Jika suatu objek adalah "Sub-kategori" itu akan memiliki set bidang "induk". Jika tidak ada bidang "induk", maka objek itu adalah "Kategori".
Setiap Sub-kategori memiliki elemen "bidang". "bidang" sebenarnya adalah larik pasangan. Ini akan membuatnya mudah untuk dirender. Jika seseorang memasuki mobil antik, Anda mencari Kategori "mobil antik" dan kemudian mengulang melalui "bidang" untuk membuat kotak input yang sesuai. Saya menggunakan hal-hal sederhana seperti "integer" dan "boolean", tetapi Anda benar-benar dapat memasukkan apa pun yang Anda inginkan di sini ("datepicker", "kotak centang", ...) semuanya terserah Anda.
Sekarang produk itu sendiri pada dasarnya menyimpan referensi untuk Kategori dan Sub-kategori. Ini juga menyimpan nilai untuk semua bidang yang telah Anda masukkan.
Jadi Produk memiliki semua data yang dibutuhkan, yang seharusnya membuat setiap produk cukup mudah untuk dirender. Muat Produk dan Sub-Kategori yang sesuai dan Anda akan memiliki semua info yang diperlukan untuk merender halaman secara dinamis.
EDIT
Sebagai balasan atas komentar, "bidang" di Kategori dapat dibangun dengan satuan ukuran:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]