【问题标题】:How to loop through a self referential model in Ruby on Rails如何在 Ruby on Rails 中循环自引用模型
【发布时间】:2019-11-28 04:35:10
【问题描述】:

我是 ruby​​ on rails 的新手,我正在构建一个 wiki 应用程序,其中导航将按类别排序。每个文章或页面可以属于一个类别,但一个类别也可以是另一个类别的子类别。管理员将能够创建新的类别或子类别,需要动态方法来生成菜单的类别列表。我试图弄清楚如何显示所有父类别及其所有子孙类别的列表,其中菜单看起来像这样:

 1. Parent1
    1.a Child1
    1.b Child2
 2. Parent2
    2.a Child1
       2.a.1 Grandchild1

我目前有一些嵌套循环在我看来是哪种工作,但它不是动态的,因为它只会显示前两代,我必须重复代码才能显示更多。

型号:

class Category < ApplicationRecord
  has_many :sub_categories, class_name: "Category", foreign_key: "category_id"
  belongs_to :category, class_name: "Category", optional: true
end

控制器:

class CategoriesController < ApplicationController
    def index
        @sorted_categories = Category.order(:sort_number).where("category_id IS NULL")
        @sub_categories = Category.order(:sort_number).where("category_id IS NOT NULL")
    end
end

查看:

<% if @categories.nil? %>
  <h3>There are currently no categories.</h3>
<% else %>
  <ul>
    <% @sorted_categories.each do |c| %>
    <li><%= c.name %><%= link_to 'Move Up', categories_move_up_path(c) %> Sort:<%= c.sort_number %></li>
    <% @sub_categories.each do |s| %>
      <% if s.category_id == c.id %>
        <ul>
          <li>
            <%= s.name %><%= link_to 'Move Up', categories_move_up_path(s) %> Sort:<%= s.sort_number %>
          </li>
        </ul>
      <% end %>
    <% end %>
  <% end %>
  </ul>
<% end %>

任何建议将不胜感激,谢谢!

【问题讨论】:

  • 您可以将ancestry gem 用于树结构。它有很多功能

标签: ruby-on-rails model-view-controller


【解决方案1】:

看看acts_as_list gem,它完全符合您的要求。

它将定义一个parent_id 列,每个对象都是父对象的子对象,这样您就可以创建无限的类别树和子类别。

它还提供了上下移动对象的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2014-10-20
    • 2020-06-03
    • 2020-04-23
    相关资源
    最近更新 更多