2013-11-11 2 views
0

Я хочу построить дерево, используя одну модель/таблицу. У меня есть модель с именем Node и атрибутом root. Для корневого узла я хочу установить его как root.Как установить объект модели как свой собственный атрибут в Rails?

Я мог бы сделать это:

n = Node.new root:0 
# save new query 
n.save 
n.root = n.id 
# save update query 
n.save 

, но я хочу сделать все это в одном запросе. Как мне это сделать?

ответ

0

Похоже, вы хотите этот драгоценный камень: 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 атрибут. Когда он равен нулю, это означает, что Node является корнем.

+0

спасибо, но я просто использовал древовидную структуру как пример – Derek

0

Вы не можете сделать это в одной операции с базой данных, поскольку идентификатор не присваивается до тех пор, пока не произойдет сохранение, а идентификатор недоступен до этой точки. Вы можете использовать фабрику (например, FactoryGirl), чтобы сделать это за одну фабричную операцию, используя крючок «после сохранения» на заводе-изготовителе.

0

Может быть что-то вроде этого, используя after_commit обратного вызова:

after_commit :set_root, :on => :create 
def set_root 
    self.update_attribute(:root_id, self.id) if root_id == 0 
end 
0

Возможно только обратные вызовы, так как объект должны быть сохранены перед загрузкой его.

Смежные вопросы