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