我正在使用Rails 3.1。我有一个模型树和一个模型TreeNode,我在Tree和TreeNodes之间建立了一个has_many / belongs_to关联。
# The initial models and associations.
class Tree < ActiveRecord::Base
has_many :tree_nodes
end
class TreeNode < ActiveRecord::Base
belongs_to :tree
end
我想添加根节点的概念,它不一定是首先创建的节点。我无法通过created_date,主键(id)或顺序隐式确定根节点(因为没有节点的顺序概念)。我试图围绕如何在Rails中建立这种关联。
我首先在Tree表上添加带有外键的root_node列,但我的Active Record关联将是Tree belongs_to Node和Node has_one Tree。这是因为具有外键的类应具有“belongs_to”关联,而另一个类应具有“has_one”关联。这对我来说听起来不对。
# This code didn't work.
class Tree < ActiveRecord::Base
has_many :script_steps
belongs_to :root_tree_node, :class => 'TreeNode'
end
class TreeNode < ActiveRecord::Base
belongs_to :tree
has_one :tree
end
我还尝试使用has_one:through创建连接表,但这些关联也不起作用。
# This code didn't work.
class Tree < ActiveRecord::Base
has_many :script_steps
has_one :root_node, :class => 'TreeNode', :through => :root_tree_node
end
class TreeNode < ActiveRecord::Base
belongs_to :tree
has_one :root_tree_node
end
# This represents the join table.
class RootTreeNode < ActiveRecord::Base
belongs_to :tree
belongs_to :tree_node
end
一般来说,建立这种关系的最佳方式是什么?在ActiveRecord中建立关联的最佳方法是什么?在一天结束时,我希望能够做到这样的事情。
tree = Tree.create
some_node = tree.tree_nodes.create
another_node = tree.tree_nodes.create
tree.root_node = another_node
tree.save
答案 0 :(得分:0)
嗯......如果你试图获得普通的树结构,例如类别树,在rails中这样做的一种方法就是:
def Category < ActiveRecord::Base
belongs_to :parent, :class_name => "Category", :foreign_key => :parent_id
end
这意味着每一行都引用其父级。 根节点是
的节点parent_id == nil
叶子节点是它的id永远不会被用作parent_id的时候。有关详细信息,请查看acts_as_tree plugin(不确定它是否适用于rails 3)。
你可以找到更有用的其他选项是nested_set(阅读更多here)