Hace poco tuve la necesidad de crear una nube de tags con Rails, y la manera más sencilla que encontré está explicada en esta entrada en Juixe TechKnow.
Si seguís el Post, lo primero que hace es añadir un método al modelo Tag para acceder a los datos. En mi caso, como prefiero no acceder a los datos desde el modelo, sino desde un controlador, o un helper, lo modifiqué para que el helper que elige el tamaño del tag, fuera el que directamente cargara el listado, liberando al modelo de esa carga:
app/helpers/application_helper.rb:
def tag_cloud(classes)
tags = Tag.find(:all,
:order => "count DESC, name",
:limit => 100).sort_by { |tag| tag.name.downcase }
max, min = 0, 0
tags.each { |t|
max = t.count.to_i if t.count.to_i > max
min = t.count.to_i if t.count.to_i < min
}
divisor = ((max - min) / classes.size) + 1
tags.each { |t|
yield t.name, classes[(t.count.to_i - min) / divisor]
}
end
Por lo demás, es una manera sencilla de crear una nube de tags, y con pequeñas modificaciones, no tiene por qué ser necesariamente de «Tags», sino que la podemos crear de cualquier entidad que tengamos.