2009-05-15 8 views
0

私は自分のレールアプリケーションで "acts_as_nested_set"を使用しています。 (素晴らしい入れ子セットプラグインで拡張されました)。私は、各要素がクローンを取得するように、要素とそのネストされたセット全体をクローンするための関数/メソッドを書く最良の方法を論理的にしようとしていましたが、新しいツリーでルート要素からネストされたセット全体をコピー/クローズする方法

入れ子になっているセットでは、の代わりにparent_id, lft, and rgtの位置指定の列が得られます。ちょうどposition_idではなく、

各セットの最下部(子供がいないノード)から始め、親を通って新しいルートまでクローンアップする必要がありますか?

これは実行されているか、すでにネストされたセットに対してこれを実行する方法があるようですが、私を誘導するものは何も見つかりません。

ありがとうございました

答えて

1

私はこれをact-as-treeで実行しました。私は集合集合を反復し、各集合を複製した。ソースのアイテムとクローンされたアイテムを、ソースがキーであり、クローンがターゲットだったハッシュに保存しました。その後、親の参照と一緒にハッシュを使用して、リレーションを解決して再マップしました。

要点を伝えるためのスニペットです。

クローンメソッドは、idを持たない新しいコピーを単にインスタンス化します。 descendantsメソッドは、直後のものだけでなく、子孫の完全なリストを返します。

def clone_branch() 
    h = {self => self.clone} #we start at the root 

    ordered = self.descendants #preserved order with acts_as_sortable 

    #clone subitems 
    ordered.each do |item| 
    h[item] = item.clone 
    end 

    #resolve relations 
    ordered.each do |item| 
    cloned = h[item] 
    item_parent = h[item.parent] 
    item_parent.children << cloned if item_parent 
    end 

    h[self] 
end 
関連する問題