2

オブジェクトを複数のツリーに分類して、その特性を反映し、ナビゲーションを構築したいと考えています。

したがって、次のツリーが与えられます。

Category1
-Category-1-1
-Category-1-2

Category2
-Category-2-1
-Category-2-2
--Category-2-2-1

オブジェクトは、たとえば、カテゴリ 1-2 とカテゴリ 2-2-1 の両方に属することができます。

目標は、データベースからすべてのオブジェクトをフェッチできるようにすることです

  • 特定のカテゴリに属する
  • 特定のカテゴリまたはその子孫に属する

より実用的な例:

カテゴリには、「ツール > ガーデニング ツール > カッター」の階層がある場合があります。

第 2 のカテゴリ: 「硬い物体 > 金属の物体 > 小さい金属の物体」

オブジェクト「プルーナー」は、「カッター」および「小さな金属製オブジェクト」に属するものとして分類されます。

できるようになりたい

  • すべての「ガーデニング ツール」を取得 -> 「剪定ばさみ」
  • 「ガーデニング ツール」のすべてのカテゴリの子を取得 -> 「カッター」
  • すべての「ハード オブジェクト」を取得 -> 「プルーナー」
  • 「Cutters」でもあるすべての「Hard objects」を取得 -> 「Pruners」
  • 「カッター」でもあるすべての「ソフト オブジェクト」を取得します -> [] ポインターはありますか? closure_tree、awesome_nested_sets などを簡単に調べましたが、それらが適切に一致するかどうかはわかりません。
4

3 に答える 3

5

ここでのコードはすべて疑似コードであることに注意してください。

ancestry gemを使用し、3 つのモデル クラスでデータをモデル化します。このようにして、データが正規化され、構築するための優れたベースになります。

Category - ancestry tree
  has_may Memberships
  has_may Products through Memberships

Membership
  belongs_to Category
  belongs_to Products

Products
  has_may Memberships
  has_may Categories through Memberships

そこから、equery を効率的に実行する方法を理解する必要があります。これを行う私の方法は、SQL でそれを行う方法を理解してから、activercord の DSL でクエリを表現する方法を理解することです。

いくつかのリソース:

クエリの例:

カテゴリを検索します。

Category.find(category_id)

カテゴリを検索し、指定されたカテゴリ内にその製品を含めます。

Category.find(category_id).join(:memberships => :products)

カテゴリのサブツリーを検索して製品を含める

Category.subtree_of(category_id).join(:memberships => :products)

商品が属するすべてのカテゴリを検索します。

Product.find(product_id).categories

于 2013-03-11T13:49:43.670 に答える