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
これは設計によるものですか?つまり、相互関係の両方の部分を設定することが常に期待されているのでしょうか?
編集:
関連する質問