Todo es posible en principio.
Por ejemplo, anteriormente creé una jerarquía de categorías de 3 niveles que también soporta intersecciones múltiples de etiquetas a nivel de categoría.
Estructura de rutas para jerarquía de categorías de 3 niveles con intersecciones múltiples de etiquetas
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
Esto es más complejo de lo que creo que deseas hacer, pero no es sostenible a menos que estés dispuesto a invertir mucho tiempo o recursos en su mantenimiento. Es probable que se rompa en algún momento cuando Discourse actualice sus versiones estándar.
Con ese contexto, hay dos cosas que debes entender sobre la estructura de rutas de categorías y etiquetas en Discourse estándar:
-
Las intersecciones múltiples de etiquetas solo son posibles a nivel del sitio completo, no a nivel de categoría. Es decir, en Discourse estándar no existen rutas para mostrar una lista de temas que pertenezcan a una categoría específica y que tengan más de una etiqueta específica. Si quisieras esto, tendrías que agregar la ruta manualmente.
-
Las intersecciones de categorías no son posibles. Es decir, no existe una ruta en Discourse para mostrar temas de dos categorías en el mismo nivel (por ejemplo, dos categorías padre o dos categorías hijas).
Aún así, puedes lograr un sistema de cuatro niveles (que parece ser tu objetivo) sin realizar adiciones significativas en el lado del servidor.
Por ejemplo, podrías usar exclusivamente etiquetas para representar los cuatro niveles. https://thepavilion.io/tags/intersection/events/bug/to-do/high representa la intersección entre las etiquetas events, bug, to-do y high en Pavilion. Podrías tener 4 menús desplegables, uno para cada grupo de etiquetas del que se extraen esas etiquetas, por ejemplo:
[plugin] [type] [status] [importance]
Una vez que hayas definido cómo quieres estructurar tu jerarquía dentro de la estructura de rutas existente de Discourse, el resto de los elementos que has mencionado son solo modificaciones del lado del cliente y son (relativamente) sencillos.