1

現在、何千ものレコードが親子関係でリンクされている Rails アプリを持っています。

各レコードのすべての子孫または祖先を効率的な方法で返すメソッドが必要です。これを再帰的に行う作業方法がありますが、現在、大量の配列 (最大 100k レコード) を作成してから、これらを平坦化し、重複を削除します。すべてのレコードを実行するのに何時間もかかる現在のコードよりも、これを達成するためのより効率的な方法はありますか? 私は厳密なツリー構造を持っていないので、Ancestry などの gem は適していないと思います。

よろしくお願いします。

class Record < ActiveRecord::Base

  has_many :children, through: :reverse_relationships, source: :child
  has_many :parents, through: :relationships, source: :parent


  def all_children
    children.map do |child|
      [child] + child.all_children
    end.flatten.uniq
  end

  def all_parents
    parents.map do |parent|
      [parent] + parent.all_parents
    end.flatten.uniq
  end
end
4

2 に答える 2

0

最も直接的なスキーマを使用することは、その性質上、かなり非効率的です。Nested Set Modelの実装を検討することをお勧めします。簡単に検索すると、Rails 用の gem がいくつかあることがわかります。

于 2013-06-28T18:24:11.900 に答える
0

ネストされたセットで階層を表現する少し異なる方法を確認してください。 https://github.com/collectiveidea/awesome_nested_set

これにより、再帰クエリがなくなります。

于 2013-06-28T18:22:24.750 に答える