我有一个使用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
这是设计的吗?也就是说,我们总是希望设置两个相互关系的部分吗?
编辑:
相关question
答案 0 :(得分: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
拉里