传统多级层级与扁平话语层级对比

原则上,一切皆有可能。

例如,我之前曾构建过一个三级分类层级结构,该结构还支持在分类层级上进行多标签交集。

支持多标签交集的三级分类层级路由结构
scope "/multi" do
  constraints(tag_id: /[^\/]+?/, format: /json|rss/) do
     get '/c/:category/t/:tag_id/*tags' => 'tags#show', as: 'tags_category_show'
     get '/c/:parent_category/:category/t/:tag_id/*tags' => 'tags#show', as: 'tags_parent_category_category_show'
     get '/c/:grandparent_category/:parent_category/:category/t/:tag_id/*tags' => 'tags#show', as: 'tags_grandparent_category_category_show'

     Discourse.filters.each do |filter|
       get "/c/:category/t/:tag_id/*tags/l/#{filter}" => "tags#show_#{filter}", as: "tags_category_show_#{filter}"
       get "/c/:parent_category/:category/t/:tag_id/*tags/l/#{filter}" => "tags#show_#{filter}", as: "tags_parent_category_category_show_#{filter}"
       get "/c/:grandparent_category/:parent_category/:category/t/:tag_id/*tags/l/#{filter}" => "tags#show_#{filter}", as: "tags_grandparent_category_category_show_#{filter}"
     end
   end
end

这比您想要实现的功能更复杂,但除非您愿意投入大量时间或资源来维护它,否则这种方案难以持续。一旦标准 Discourse 发生更新,它很可能会失效。

基于上述背景,关于标准 Discourse 中的分类与标签路由结构,有两点需要理解:

  1. 多标签交集仅能在站点范围内实现,无法在分类层级实现。也就是说,标准 Discourse 中没有现成的路由来展示“特定分类下且带有多个特定标签”的主题列表。如果您需要此功能,必须自行添加相应路由。

  2. 分类之间的交集无法实现。也就是说,Discourse 中没有路由可以展示来自同一层级的两个分类(例如两个父分类或两个子分类)的主题。

您仍然可以在不大幅修改服务器端代码的情况下实现四级层级系统(这似乎正是您的目标)。

例如,您可以完全使用标签来表示这四个层级。https://thepavilion.io/tags/intersection/events/bug/to-do/high 即表示 Pavilion 上“events”、“bug”、“to-do”和“high”这些标签的交集。您可以设置四个下拉菜单,分别对应这些标签所属的四个标签组,例如:

[插件] [类型] [状态] [重要性]

一旦您确定了如何在现有 Discourse 路由结构中构建您的层级体系,其余您列出的功能就只是客户端的修改,实现起来(相对) straightforward。