2009-08-28 8 views
0

私は、act-as-treeを使用するモデルを持っています。例えば:ツリー全体が構築されるまで、私は何も保存していない、私のツリーを構築していたスクリプト/コンソールからActiveRecordの関連付けはデータベースにコミットする前に有効ですか?

class ActsAsTree 
    belongs_to :parent 
    has_many :children 
end 

:ツリーとして

class CartoonCharacter < ActiveRecord::Base 
    acts_as_tree 
end 

行為は、これらの関連を持っています。私が抱えている問題は、データベースにコミットする前に、ツリーを正常にナビゲートできないことです。 #parentと#siblingを呼び出すと疑わしい結果が生成されます。私は何かが欠落しているとしか思えません。

fred=CartoonCharacter.new(:name=>'Fred') 
fred.children.build(:name => 'BamBam') 
pebbles = fred.children.build(:name => 'Pebbles') 

fred.children #=> [BamBam, Pebbles] 
fred.children.last.parent #=> nil --- why not Fred? 
pebbles.siblings #=> [completely unrelated records from db??] 

これは、関連付けの処理方法と関係があります。私はメモリ内のActiveRecord構造が完全にナビゲート可能であると想像しましたが、そうではないようです。コンソールへのロギングを強制することから、私は時々、アソシエーション間を移動するとデータベースにアクセスすることに注意しました。これにより、関連付けを一周する方法を知ることが難しくなります。 (私はクエリキャッシングを簡単に見ました。)他の人はどのようにこれを処理していますか?あるいは、あなたが行くにつれて、常にレコードとその関係を託していますか?これは困惑しています。


EDIT:この問題を解決するように見える何

は、同時に両方の関係を設定することです。

pebbles.parent = fred 
bambam.parent = fred 

これは仕様によるものです:それは欠落している部分があったのですか?つまり、我々は常に相互関係の両方の部分を設定することが期待されていますか?


EDIT:

関連question

答えて

0

あなたはacts_as_treeプラグインを使用していますか? - http://github.com/rails/acts_as_tree/tree/master

あなたが望む/期待する方法で動作します。

自分でこのデータ構造をロールバックしている場合は、OPに記載されている関連付けが完了していません。異なる外部キーを参照しています。

belongs_to :parent # parent_id field in this model 
has_many :children # child_id field in the child models 

現在のところ、インスタンスのペア間には2つの異なる関連があります。だからこそ、2つの代入文を作る必要があります。代わりに、上記の

、より

belongs_to :parent, :class_name => "CartoonCharacter", 
    :foreign_key => :tree_key 

has_many :children, :class_name => "CartoonCharacter", 
    :foreign_key => :tree_key 

ラリー

ような何か私に戻って取得するために時間を割いて
+0

感謝。私はすべてを適切に設定したと信じていても、動作させることができませんでした。私は、子にafter_addコールバックを使用し、そこに親を割り当てることで、これを動作させました。 – Mario

関連する問題