2009-08-28 73 views
0

我有一個使用行爲樹的模型。例如:在提交數據庫之前ActiveRecord關聯是否有效?

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 

這是故意破壞嗎?也就是說,我們是否總是期望設定一個相互關係的兩個部分?


編輯:

相關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 

所以目前,在實例對之間有兩種不同的關聯。這就是爲什麼你必須做兩個賦值語句。

代替上面,更多的東西一樣

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

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

拉里

+0

感謝您抽出寶貴的時間來打電話給我。即使我相信我已經正確設置了所有內容,但我仍無法完成工作。我確實通過對孩子使用after_add回調並在那裏分配父項來得到這個工作。 – Mario 2009-08-30 00:22:42

相關問題