Использование драгоценного камня предков для создания отношений родитель-потомок-внук в рубине

Последние два дня я пытался освоить жемчужину предков. Я проверил один или два учебника, но они старые и содержат много ошибок или не работают. Я смог получить немного информации о предках. но мне нужна помощь в том, как правильно определить родителей, детей, корневых и внуков. Я прочитал документацию, но не могу ее правильно понять. Поток моего проекта.

----Родитель1

------Ребенок1

---------Внук1

------Ребенок2

----Родитель2

------Ребенок1

Теперь я понял, как создать родительский идентификатор. Это мой код.

  def index
 @messages = Message.all
 end

 def show
    @page = Message.where(:ancestry => params[:id])
  end

  def new
    @message_id = Message.find(params[:id])
  end

 def create
    @page = Message.new(message_params)
    @page.parent_id = params[:parent_id]
   #@page = Message.new(message_params)

     if @page.save
        flash[:notice] = "The Mesage was created succeffully"
       redirect_to(:action => 'index')
    else
      render('new')
  end
end

Это индексный файл, который отображает данные, а также может публиковать сообщения.

<div class="Pages index">
   <h2>Messages</h2>

   <%= link_to("Add new Page",{:action => 'new'}, :class => 'action new') %>

     <table class="listing" summary="Page list">
       <tr class="header">
          <th>&nbsp;</th>
          <th>ID</th>
          <th>Content Title</th>
          <th>Content</th>
          <th>Parent Id</th>
       </tr>

       <% @messages.each do |page| %>
       <tr>
          <td><%= page.id %>
          <td><%= page.content_title %>
          <td class="center"><%= page.content %>
          <td class="center"><%= page.parent_id %>

          <td class="actions">
             <%= link_to("Reply",{:action => 'new',:id => page.id},:class =>'action show') %>
             <%= link_to("Show",{:action => 'show',:id => page.id},:class =>'action show') %>        

          </td>
        </tr>
        <% end %>
        </table>
        </div> 

        <div class="Pages new">
   <h2> Create Pages</h2>
     <%= form_for(:message, :url => {:action => 'create'}) do |f| %>
     <table summary="Page form fields">

        <tr>
          <th>Content_title</th>
          <td><%= f.text_field(:content_title) %></th>
        </tr>
        <tr>
          <th>Content</th>
          <td><%= f.text_field(:content) %></th>
        </tr>
        </table>

        <div class="form-buttons">
          <%= submit_tag("Submit Form") %>
          </div>

          <% end %>
        </div>

Это файл ответа, который, когда пользователь нажимает кнопку ответа, передает parent_id

<div class="Pages new">
   <h2> Create Pages</h2>
     <%= form_for(:message, :url => {:action => 'create',:parent_id => @message_id}) do |f| %>
     <table summary="Page form fields">
     <tr>
          <th>ParentID</th>
          <td><%= f.text_field(:id) %></th>
        </tr>
        <tr>
        <tr>
          <th>Content Title</th>
          <td><%= f.text_field(:content_title) %></th>
        </tr>
        <tr>
          <th>Content</th>
          <td><%= f.text_field(:content) %></th>
        </tr>
        </table>

        <div class="form-buttons">
          <%= submit_tag("Submit Form") %>
          </div>

          <% end %>
        </div>   

Вот файл шоу

<%= link_to("Back to List",{:action => 'index'}, :class => 'action new') %>

<div class="Pages show">
   <h2> Show Pages</h2>

     <table summary="Pages detail view">
          <th>Parent ID</th>
        </tr>
        <tr>
          <th>Message Content Title</th>
        </tr>
        <tr>
          <th>Content</th>
        </tr>
        <% @page.each do |page| %>
       <tr>
          <td><%= page.id %>
          <td><%= page.content_title %>
          <td class="center"><%= page.content %>
          <td class="center"><%= page.parent_id %>
         </td>
         </td>
         </td>
         </td>
         </tr>
         <%end%>
         </table>

Теперь это было просто, но как мне выбрать корень и дочерний узел и как отобразить их соответственно. Я попробовал консоль rails, чтобы получить представление, но есть еще одна проблема. Например, если родитель содержит несколько дочерних элементов, он отображает результат, но если дочерний элемент содержит дочерние элементы, он ничего не показывает, хотя, когда родительский дочерний элемент отображается, все его внуки также получают отображается. Я немного смущен этим. Любая помощь приветствуется


person soldiershin    schedule 05.01.2015    source источник
comment
Вы можете показать, где объявляется переменная @messages?   -  person lcguida    schedule 05.01.2015
comment
Забыл добавить вот он   -  person soldiershin    schedule 05.01.2015
comment
Я не мог понять, чего вы пытаетесь достичь здесь. Вы получаете все сообщения и перечисляете их. Где в вашем коде вы видите эти отношения родитель/потомок?   -  person lcguida    schedule 05.01.2015
comment
Когда нажимается кнопка ответа и вызывается функция создания, устанавливается родительский идентификатор, а при нажатии кнопки показа отображаются все узлы с этим конкретным parent_id. Я не знаю, как правильно установить отношение родитель/дочерний элемент. Я подумал, что объяснение или пример, показывающий взаимосвязь, может мне помочь.   -  person soldiershin    schedule 05.01.2015
comment
В моей модели есть только атрибут has_ancestry.   -  person soldiershin    schedule 05.01.2015
comment
И вы не можете делать то, что хотите, с помощью методов, предоставляемых камнем предков? (например, дети, потомки и т. д.)? Вы понимаете древовидную структуру данных? (См. en.wikipedia.org/wiki/Tree_(data_structure))   -  person lcguida    schedule 05.01.2015
comment
Моя таблица содержит атрибут ancestry, и я могу установить parent_id, но я не знаю, как использовать атрибуты children, root, siblings. Кажется, я не могу понять, как их использовать более точно.   -  person soldiershin    schedule 05.01.2015


Ответы (1)


Из того, что я вижу, я не думаю, что вы понимаете древовидную структуру данных.

Я рекомендую прочитать это: http://en.wikipedia.org/wiki/Tree_(data_structure)< /а>

Например, у вас есть следующее дерево:

-parent 1
 -child 1.1 (parent -> parent 1)
 -child 1.2 (parent -> parent 1)
 -granddchild 1.2.1 (parent -> child 1.2)
-parent 2
 -child 2.1

Таким образом, в этом примере родительские узлы 1 и 2 являются корневыми узлами (у них нет родителя). ребенок 1.1 и 1.2 (являются детьми родителя 1). Поэтому, если вы хотите получить к ним доступ, вы должны сделать:

parent1.children

grandchild1.2.1 является дочерним элементом узла child1.2 и внуком узла parent1.

Чтобы получить все от parent1, вы должны запросить потомков:

parent1.descendants

Братья и сестры — это узлы с одним и тем же родителем, например дочерние узлы 1.2 и дочерние узлы 1.1.

Пример использования: У вас есть ребенок1.1, и вы хотите, чтобы у него были братья и сестры (братья). Вместо того, чтобы делать

child1.1.parent.children

Вы бы сделали:

ребенок1.1.братья и сестры

Это всего лишь несколько примеров, но для того, чтобы полностью понять методы, доступные в камне предков, вам действительно следует изучить и понять структуру данных дерева.

person lcguida    schedule 05.01.2015
comment
Это хорошо, я понимаю, и я знаю, как работает дерево и все такое, и я не знаю, как увидеть деревья в арилах, используя родословную, например, если я вызову messages = Message.where(:ancestry => 20), а затем позвоню page = messages.children, он должен возвращать всех дочерних элементов, но он говорит о неопределенном методе. Это не значит, что я не знаю, как использовать древовидные структуры, я не знаю, как установить его с помощью родословной. - person soldiershin; 05.01.2015
comment
Message.where вернет набор записей сообщений. В этой коллекции нет метода children. Поэтому я думаю, что вы путаете рельсы, а не драгоценный камень предков. - person lcguida; 05.01.2015
comment
Я был бы очень признателен, если бы вы показали мне простой пример с использованием драгоценного камня предков, чтобы я понял идею. - person soldiershin; 05.01.2015
comment
Я буду. Но я еще не мог понять, чего вы пытаетесь достичь. Вы хотите показать все сообщения (все дерево) с учетом «родительского сообщения»? Или вы хотите показать только непосредственных потомков этого «родительского сообщения»? Что у вас есть (вы не разместили код своего шоу) - person lcguida; 05.01.2015
comment
Я загрузил код шоу. На самом деле я хочу сделать обе эти вещи, но если бы вы могли показать мне одну, я бы понял. - person soldiershin; 05.01.2015
comment
Я показал вам в ответе. считайте parent1 вашим родительским узлом parent1 = Message.find(parent_id). Я показал вам, как получить children и descendants (это все дети, внуки и так далее) - person lcguida; 05.01.2015