2

act_as_tree を使用して、完全な子階層を持つツリー全体を 1 回の SQL 呼び出しでプリロードできるようにしたいと考えています。そのために、tree_id をテーブルに追加し、そのツリー内のすべての子孫を通過します。

可能性としてacts_as_nested_set(実際にはawesome_nested_set)を調査しましたが、ツリーを他のツリーに移植したため、ネストされたセットを目的に使用すると更新が多すぎることがわかりました。act_as_versioned とともに、これは私が求めている設計にとって容認できない複雑さです。私の目的には、acts_as_tree の方が適していると思います。

私の唯一の問題は、階層をそのままにしてツリー全体を取得することです。ActiveRecord の :include オプションは、:children では機能しますが、:descendants では機能しません。アソシエーションを手動で取得してマッピングするための独自のメソッドを作成することに満足しています。これを達成するためのガイダンスや例はありますか?

私の見解では、ツリー (構造化されたツリー全体の取得をサポートするもの) を使用するために脇に置いているネストされたセットの唯一の利点は、ツリーの任意のサブセクションを選択的に取得できることです。私はそれで大丈夫です。

私が回避したい解決策は、ツリーに付随する :children 関連付けを排除し、各ツリーノードで定義された子配列を定義して手動でロードすることです。

4

2 に答える 2

1

私は過去にこれを調べました.IIRCは、テーブルをそれ自体とn回結合することにより、単一のSQLクエリで既知の深さのツリーをロードできることを発見しました。ただし、任意のサイズの完全なツリーをロードすることはできません。したがって、ネストされたセットの設計が必要です。

データ セットが比較的小さい場合は、すべてのレコードを取得して、メモリ内でツリーを再構築できます。おそらくそれで十分でしょうか?

于 2009-10-01T17:59:31.973 に答える
0

index_tree Gem を使用すると、ツリーの熱心な読み込み方法が提供されます。

 RootModel.find(1).preload_tree

詳しい説明はこちらのブログ

于 2015-03-26T22:11:12.107 に答える