OK, tôi không phải là chuyên gia Ruby / Mongomapper, vì vậy tôi sẽ không thể ánh xạ điều này thành "mô hình". Tuy nhiên, nếu bạn nhìn điều này từ góc độ của Mongo, đây là cách bạn có thể muốn dữ liệu hiển thị trong Mongo.
Bộ sưu tập: Danh mục
{"_id" : "car"}
{"_id" : "vintage_car", "parent" : "car", "fields" : ["year" : "integer", "original_parts" : "boolean", "upgrades" : "text"] }
Bộ sưu tập : Sản phẩm
{"_id" : "1234", "name" : "Model-T", "category" : "car", "sub-category" : "vintage_car", "values" : ["year" : 1942, "original_parts" : false, "upgrades : "XM Radio"] }
Vì vậy, những gì bạn có ở đây là khá đơn giản. Bạn có một bộ sưu tập chứa tất cả các Danh mục và Tiểu mục. Nếu một đối tượng là một "Danh mục con" thì nó sẽ có một bộ trường "cha". Nếu không có trường "cha" thì đối tượng đó là "Category".
Mỗi danh mục con có một phần tử "trường". "trường" thực sự là một mảng các cặp. Điều này sẽ giúp bạn dễ dàng kết xuất. Nếu ai đó nhập một chiếc xe hơi cổ điển, bạn tra cứu Danh mục "xe hơi cổ điển" và sau đó lặp qua các "trường" để hiển thị các hộp nhập thích hợp. Tôi đã sử dụng những thứ đơn giản như "số nguyên" và "boolean", nhưng bạn thực sự có thể đặt bất cứ thứ gì bạn muốn vào đây ("datepicker", "checkbox", ...) tùy thuộc vào bạn.
Bây giờ, về cơ bản, sản phẩm lưu trữ một tham chiếu đến cả Danh mục và Danh mục phụ. Nó cũng lưu trữ các giá trị cho tất cả các trường mà bạn đã nhập.
Vì vậy, Sản phẩm có tất cả dữ liệu mà nó cần, điều này sẽ làm cho mỗi sản phẩm trở nên khá dễ dàng để hiển thị. Tải Sản phẩm và Danh mục phụ thích hợp và bạn sẽ có tất cả thông tin cần thiết để hiển thị động trang.
CHỈNH SỬA
Để trả lời nhận xét, các "trường" trong Danh mục có thể được xây dựng với một đơn vị đo lường:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]