OK、私はRuby / Mongomapperの専門家ではないので、これを「モデル」にマッピングすることはできません。ただし、これをMongoの観点から見ると、Mongoでデータをどのように表示するかを次に示します。
コレクション: カテゴリ
{"_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"] }
したがって、ここにあるものは非常に単純です。すべてのカテゴリとサブカテゴリを含む1つのコレクションがあります。オブジェクトが「サブカテゴリ」の場合、「親」フィールドが設定されます。 「親」フィールドがない場合、そのオブジェクトは「カテゴリ」です。
各サブカテゴリには「fields」要素があります。 「フィールド」は実際にはペアの配列です。これにより、レンダリングが簡単になります。誰かがヴィンテージカーに入った場合は、「ヴィンテージカー」カテゴリを検索し、「フィールド」をループして適切な入力ボックスをレンダリングします。 「integer」や「boolean」などの単純なものを使用しましたが、ここには実際に好きなもの(「datepicker」、「checkbox」など)を入れることができます。すべてはあなた次第です。
現在、製品自体は基本的にカテゴリとサブカテゴリの両方への参照を格納しています。また、入力したすべてのフィールドの値も保存されます。
したがって、製品には必要なすべてのデータが含まれているため、各製品のレンダリングが非常に簡単になります。製品と適切なサブカテゴリをロードすると、ページを動的にレンダリングするために必要なすべての情報が得られます。
編集
コメントへの返信として、カテゴリの「フィールド」 測定単位で作成できます:
..."fields" : [{"length","meters","float"},{"weight","kg","float"},...]