Повторение записей в rails view и контроллере

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

Как я могу выводить категории и подкатегории в rails View? Вот так:

  • Название первой категории
    • Имя дочернего элемента первой категории 1
    • Имя дочернего элемента первой категории 2
    • Имя дочернего элемента первой категории 3
  • Название второй категории
    • Имя дочернего элемента второй категории 1
    • Имя дочернего элемента второй категории 2
    • Имя дочернего элемента второй категории 3

моя схема.rb:

 create_table "categories", force: :cascade do |t|
    t.integer  "title"
    t.boolean  "state",          default: true
    t.integer  "parent_id"       # id of parent category
end
  

мои categories_controller.rb

 def show
    @category = Category.find(params[:id])
    #child categories of current parent category
    @child_categories = Category.where(parent_id: @category.id)
    #subchild categories of current parent category
    @child_categories.each do |category|
        @subchild_categories = Category.where(parent_id: category.id)
    end
end
  

мой show.html.erb

 <% if @child_categories.any?  %>
<ul>
<% @child_categories.each do |child| %>
    <li>
        <%= child.title %>
        <ul>
            <% @subchild_categories.each do |subchild| %>
                <li><%= subchild.title %></li>
            <% end %>
        </ul>
    </li>
<% end %>
</ul>
<% end %>
  

Теперь я получаю что-то вроде этого:

  • Название первой категории
    • Имя дочернего элемента второй категории 1
    • Имя дочернего элемента второй категории 2
    • Имя дочернего элемента второй категории 3
  • Название второй категории
    • Имя дочернего элемента второй категории 1
    • Имя дочернего элемента второй категории 2
    • Имя дочернего элемента второй категории 3

Ответ №1:

 #try this:    

def show
    @category = Category.find(params[:id])

    @child_categories = Category.where(parent_id: @category.id)

   @subchild_categories = {}
   @child_categories.each do |category|
     @subchild_categories[category.title] = Category.where(parent_id: category.id)
   end
end



#and in view:

<% @child_categories.each do |child| %>
   <li>
      <%= child.title %>
      <ul>
          <% @subchild_categories[child.title].each do |subchild| %>
              <li><%= subchild.title %></li>
        <% end %>
    </ul>
  </li>
<% end %>
  

Ответ №2:

Вы можете создать children метод в вашей Category модели, который вызывает where(parent_id: id) , а затем просто использовать его

 def self.children
  where(parent_id: id)
end
  

И затем вы можете использовать его для вашего просмотра столько, сколько захотите:

 @category.children.each do |child_category|
  child_category.children.each do |sub_child_category|
    sub_child_category.children.each do |sub_sub_child_category|
      // as much as you want to
    end
  end
end