He estado trabajando en “pet projects” como proceso de aprendizaje de Ruby on Rails, ultimamente he estado trabajando con base de datos MongoDB con el manejador Mongoid, es muy emocionante trabajar con MongoDB por que es orientado a documentos y es sin esquemas, por lo que puedes agregar campos nuevos a documentos sin grandes complicaciones, tampoco tienes que lidiar con migraciones de base de datos y cosas asi.
Lo próximo que estuve buscando es como agregarle etiquetas a un documento de MongoDB, tal como se le agregan palabras clave a una entrada de blog o a un video de youtube, para ActiveRecord existe un plugin que se llama acts_as_taggable_on y otro muy similar acts_as_taggable_on_steroids al parecer son los mas usados en Ruby/Rails pero desafortunadamente no funcionan con Mongoid ya que dependen de ActiveRecord.
Entonces estuve buscando como las personas que usan MongoDB llevan a cabo el etiquetado de sus documentos. Afortunadamente encontre una entrada de blog de jpemberthy “Adding tags to Mongoid Documents” el cual el desarrolla su propia implementacion sencilla de un solo arreglo para etiquetado a documentos MongoDB en Mongoid, el código es pequeño se entiende bastante bien y de hecho es un gist de github.
Para hacer uso de esa implementación sólo tienes que agregar el código dentro del folder
[nombre_aplicacion]/config/initializers
con cualquier nombre, yo use mongoid_tags.rb , posteriormente en tu modelo debes incluir la implementacion.
class Article
include Mongoid::Document
include Mongoid::Document::Taggable
Con sólo eso es más que suficiente para que tu documento soporte asignarle etiquetas, ahora, para asignarle etiquetas tienes que hacerlo de esta forma
@articulo = Articulo.new(:name => "Mongoid rocks!")
@articulo.tag_list = "mongodb, mongoid, taggable"
@articulo.tags # => ["mongodb", "mongoid", "taggable"]
@articulo.save
Como vemos, para asignarle etiquetas a nuestro documento se lo asignamos a tag_list como una string donde las palabras que le queremos asignar estan separadas por comas, pero al regresar las etiquetas nos la regresa como un arreglo.
Al igual podemos hacer busquedas de documentos dependiendo de las etiquetas que queramos
Article.tagged_with("mongodb") # => @articulo
Article.tagged_with(["mongodb", "mongoid"]) # => @articulo
@articulo2 = Article.new(:name => "JQuery Rocks!")
@articulo2.tag_list = "taggable"
@articulo2.save
Article.tagged_with("taggable") # => [@articulo, @articulo2]
Ok, pues todo esto va bastante bien, pero como hacemos uso de esta característica en Rails3? hice otra busqueda de como hacer uso de etiquetas en JQuery, para lo cual encontre el plugin tagsinput no sabría decirles si es el mejor o de los mejores pero me gusto por su facilidad de uso, lo visual y además algo muy importante que buscaba en el plugin fue el hecho de que las etiquetas que vas agregando se van guardando separadas por comas en un text input que esta escondido, esto me facilito ligarlo a mi forma de Rails.
Ahora para hacer uso de este plugin en nuestra aplicación lo hacemos de esta manera
<%= f.label :tags %>
<%= f.text_field :tag_list %>
Y al inicializar la forma agregamos
$(document).ready(function(){
$('#article_tag_list').tagsInput();
});
Y listo! facil no? :-)