0

act-as-tree を使用するモデルがあります。例えば:

class CartoonCharacter < ActiveRecord::Base
  acts_as_tree
end

ツリーには次の関連付けがあります。

class ActsAsTree
  belongs_to :parent
  has_many :children
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 構造は完全にナビゲートできると想像していましたが、そうではないようです。コンソールへのロギングを強制することから、アソシエーション間をナビゲートするとデータベース アクセスが発生することに気付いたことがあります。これにより、アソシエーションを迂回する方法を知ることが難しくなります。(クエリのキャッシングについて簡単に調べました。) 他の人はこれをどのように処理していますか? それとも、常にレコードとその関係をコミットしていますか? これは不可解です。


編集:

この問題を解決すると思われるのは、両方の関係を同時に設定することです。つまり、欠けていたのは次の部分でした。

pebbles.parent = fred
bambam.parent = fred

これは設計によるものですか?つまり、相互関係の両方の部分を設定することが常に期待されているのでしょうか?


編集:

関連する質問

4

1 に答える 1

0

act_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

ラリー

于 2009-08-28T02:53:58.680 に答える