在Rails中,如何为两个以不同方式相互引用的模型建立ActiveRecord关联?

时间:2011-11-17 19:38:34

标签: ruby-on-rails ruby-on-rails-3 database-design activerecord relational-database

我正在使用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

1 个答案:

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