使用祖先gem在ruby中创建父子孙关系

时间:2015-01-05 18:03:51

标签: ruby-on-rails ruby ancestry

过去两天我试图获得一个祖先宝藏。我已经检查了一两个教程,但它们已经老了,有很多错误或者没有工作。我已经能够得到一个我很少有祖先,但我想要一些帮助,如何正确定义父母,孩子,根和孙子。我已经阅读了文档,但我无法掌握它。我的项目的流程是。

---- Parent1

------ Child1

--------- Grandchild1

------ CHILD2

---- Parent2

------ Child1

现在我已经了解了如何创建父ID。这是我的代码。

  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 console来获得一个想法,但还有另外一个问题。例如 如果父项包含多个子项,则显示结果,但如果子项包含子项,则它不会显示任何内容,但显示父项时,其所有孙子项也会显示。我对此感到困惑。感谢任何帮助< / p>

1 个答案:

答案 0 :(得分: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。

使用示例:你有child1.1,你想要它的兄弟姐妹(兄弟)。而不是做

child1.1.parent.children

你会这样做:

child1.1.siblings

这些只是一些例子,但为了充分理解祖先宝石中可用的方法,你真的应该研究和理解树数据结构