在提交数据库之前,ActiveRecord关联是否有效?

时间:2009-08-28 02:06:51

标签: ruby-on-rails ruby acts-as-tree

我有一个使用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

1 个答案:

答案 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

拉​​里