Ruby on rails 如何使用具有子类别的类别(使用Rails)创建模型?

Ruby on rails 如何使用具有子类别的类别(使用Rails)创建模型?,ruby-on-rails,many-to-many,blogs,categories,Ruby On Rails,Many To Many,Blogs,Categories,我正在通过Rails创建一个博客。我通过多对多关系将帖子和类别模型关联起来。如何将子类别合并到此模型中?创建子类别模型,如下所示: # post.rb has_and_belongs_to_many :categories has_many :sub_categories # category.rb has_and_belongs_to_many :posts has_many :sub_categories # sub_category.rb belongs_to :category b

我正在通过Rails创建一个博客。我通过多对多关系将帖子和类别模型关联起来。如何将子类别合并到此模型中?

创建子类别模型,如下所示:

# post.rb
has_and_belongs_to_many :categories
has_many :sub_categories

# category.rb
has_and_belongs_to_many :posts
has_many :sub_categories


# sub_category.rb
belongs_to :category
belongs_to :post
# delegate attributes like so
delegate: :title, to: :category

最好的方法是使用一个层次结构gem,通常是
祖先
闭包树
,为您的
类别
创建一个“树”型结构。然后,您将能够将
博客
与每个类别关联,从而创建所需的层次结构功能

我们以前已经实现了这一点-使用
祖先
gem:


类别

从上图中可以看出,您缺少的“秘诀”是您的类别不在基于层次结构的结构中

这一点之所以重要,是因为如果你将博客文章与特定的
类别关联起来,为了使这些类别达到你想要的“子类别”结构,你需要能够创建一个支持它的系统,从而形成
层次结构
gems

具体地说,您目前正在创建一个单独的
sub_category.rb
模型。正确的方法是使用onemodel-
Category
,并使用层次结构gems为您提供树基础结构

我们是这样做的:

#app/models/category.rb
class Category < ActiveRecord::Base
   has_ancestry #-> enables the "ancestry" gem
   has_and_belongs_to_many :posts
end

#app/models/post.rb
class Post < ActiveRecord::Base
   has_and_belongs_to_many :categories #-> you'll need a blogs_categories table with blog_id | category_id
end
这将允许您调用以下命令:

#app/views/categories/index.html.erb
<%= render partial: "category", locals: { collection: @categories } %>
#app/views/categories/index.html.erb
#app/views/categories/_category.html.erb
<ol class="categories">
    <% collection.arrange.each do |category, sub_item| %>
        <li>
            <!-- Category -->
            <%= link_to category.title, edit_admin_category_path(category) %>

            <!-- Children -->
            <% if category.has_children? %>
                <%= render partial: "category", locals: { collection: category.children } %>
            <% end %>

        </li>
    <% end %>
</ol>
#app/views/categories/index.html.erb
<%= render partial: "category", locals: { collection: @categories } %>