2

私は、レールでモデル化して永続化しようとしているデータ構造を持っています。これは自己参照であり、階層ツリーによく似ていますが、親を1つだけにする代わりに、各ノードに複数の親と複数の子を含めることができます。

次のようになります(すべてのノードは同じモデルです)。

                       Foo            Bonk
                     |    |          |    |
                    Bar   Baz      Foo   Bork 
                   |   |
                 Baz   Bork

同じ名前のすべてのノードが実際には同じノードである場合。

また、特定の「成分」を含むモデルのすべてのインスタンスを検索したいと思います。

私が見つけた最も近いものはhttps://github.com/mceachen/closure_treeでしたが、私が知る限り、各ノードには1つの親しかありません。

ActiveRecordで実装するパターンを理想的に探していますが、解決策を検討します。

4

1 に答える 1

1

親が1つしかないノードごとに、これは適切な方法です。

has_many :children, :class_name => "Node", :foreign_key => "parent_id"
belongs_to :parent, :class_name => "Node", :foreign_key => "parent_id"

お分かりのように、親ノードを指すparent_idという名前のフィールドを持つActiveRecordモデルです。

複数の親の場合、これを拡張して、多対多の自己参照結合を作成できます。

has_and_belongs_to_many :children, :class_name => "Node",
    :foreign_key => "node_id",
    :association_foreign_key => "children_id",
    :join_table => "children_nodes"

結合テーブルを作成します。これで、親に対してNode.childrenとNode.nodesを実行できるようになります。注:2番目の部分はテストされていませんが、機能しない場合はお知らせください。

于 2012-08-16T01:49:35.990 に答える