0

我有一个使用充当树的模型。例如:

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

你在使用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

拉里

于 2009-08-28T02:53:58.680 回答