我想使用一个模型/表来构建一棵树。我有一个名为的模型Node
和一个属性root
。对于根节点,我想将其设置为root
.
我可以这样做:
n = Node.new root:0
# save new query
n.save
n.root = n.id
# save update query
n.save
但我想在一个查询中完成这一切。我该怎么做呢?
我想使用一个模型/表来构建一棵树。我有一个名为的模型Node
和一个属性root
。对于根节点,我想将其设置为root
.
我可以这样做:
n = Node.new root:0
# save new query
n.save
n.root = n.id
# save update query
n.save
但我想在一个查询中完成这一切。我该怎么做呢?
可能只能通过回调,因为对象必须在获取之前保存。
听起来你想要这个宝石:https ://github.com/rails/acts_as_tree
root = Category.create("name" => "root")
child1 = root.children.create("name" => "child1")
subchild1 = child1.children.create("name" => "subchild1")
基本上,您的 Node 模型将具有 parent_id 属性。当它为 nil 时,意味着 Node 是根。
您不能在单个数据库操作中执行此操作,因为在保存发生之前不会分配 id,并且在该点之后 id 才可用。您可以使用工厂机制(例如 FactoryGirl)在单个工厂操作中使用工厂机制的“保存后”挂钩来执行此操作。
after_commit
使用回调可能是这样的:
after_commit :set_root, :on => :create
def set_root
self.update_attribute(:root_id, self.id) if root_id == 0
end