Você já ouviu falar sobre a coluna array no postgresql? Você sabia que já dá para fazer um bom uso dela?
Tudo que você precisa fazer é ir para https://github.com/dockyard/postgres_ext e seguir as instruções para criar uma coluna de tags para o seu modelo de trilhos. Basicamente, apenas um campo de texto que será tratado como um array por postgresql e postgres_ext ajudará a convertê-lo em um array de string regular em ruby.
Descobrir quantos registros estão marcados com algo é fácil, mas fazer uma contagem de grupo não é tão simples para um desenvolvedor Ruby. A consulta abaixo faz exatamente isso, sem ter que juntar 3 tabelas diferentes no processo.
explain analyze
with tags as (
select unnest(tags) as tag_name from tasks where user_id = 1
) select
count(9),
tag_name
from
tags
group by
tag_name