In linea di principio, tutto è possibile.
Ad esempio, in passato ho creato una gerarchia di categorie a 3 livelli che supporta anche intersezioni multiple di tag a livello di categoria.
Struttura delle rotte per gerarchia di categorie a 3 livelli con intersezioni multi-tag
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
Questa soluzione è più complessa di quanto credo tu voglia fare, ma non è sostenibile a meno che tu non sia disposto a investire molto tempo o risorse per mantenerla. È probabile che si rompa in qualche punto quando Discourse subirà aggiornamenti standard.
Con questo contesto, ci sono due cose da comprendere riguardo alla struttura delle rotte per categorie e tag in Discourse standard:
-
Le intersezioni multi-tag sono possibili solo a livello dell’intero sito, non a livello di categoria; cioè, in Discourse standard non esistono rotte per mostrare un elenco di argomenti che appartengano a una categoria specifica e abbiano più di un tag specifico. Se volessi questa funzionalità, dovresti aggiungere la rotta.
-
Le intersezioni tra categorie non sono possibili. Cioè, non esiste una rotta in Discourse per mostrare argomenti provenienti da due categorie allo stesso livello (ad esempio, due categorie genitore o due categorie figlie).
Puoi comunque realizzare un sistema a quattro livelli (che sembra essere il tuo obiettivo) senza apportare modifiche significative lato server.
Ad esempio, potresti utilizzare esclusivamente i tag per rappresentare i quattro livelli. https://thepavilion.io/tags/intersection/events/bug/to-do/high rappresenta l’intersezione tra i tag events, bug, to-do e high su Pavilion. Potresti avere 4 menu a tendina, uno per ciascun gruppo di tag da cui sono tratti i tag, ad esempio:
[plugin] [type] [status] [importance]
Una volta capito come strutturare la tua gerarchia all’interno della struttura delle rotte esistente di Discourse, il resto delle cose che hai elencato sono solo modifiche lato client e sono (relativamente) semplici.