原则上,一切皆有可能。
例如,我之前曾构建过一个三级分类层级结构,该结构还支持在分类层级上进行多标签交集。
支持多标签交集的三级分类层级路由结构
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 中的分类与标签路由结构,有两点需要理解:
-
多标签交集仅能在站点范围内实现,无法在分类层级实现。也就是说,标准 Discourse 中没有现成的路由来展示“特定分类下且带有多个特定标签”的主题列表。如果您需要此功能,必须自行添加相应路由。
-
分类之间的交集无法实现。也就是说,Discourse 中没有路由可以展示来自同一层级的两个分类(例如两个父分类或两个子分类)的主题。
您仍然可以在不大幅修改服务器端代码的情况下实现四级层级系统(这似乎正是您的目标)。
例如,您可以完全使用标签来表示这四个层级。https://thepavilion.io/tags/intersection/events/bug/to-do/high 即表示 Pavilion 上“events”、“bug”、“to-do”和“high”这些标签的交集。您可以设置四个下拉菜单,分别对应这些标签所属的四个标签组,例如:
[插件] [类型] [状态] [重要性]
一旦您确定了如何在现有 Discourse 路由结构中构建您的层级体系,其余您列出的功能就只是客户端的修改,实现起来(相对) straightforward。