2009-08-28 28 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

相关问题