Foreigner

Puede que sea una rareza mía, pero me gusta tener bien definidas las foreign keys en mis aplicaciones. Con Ruby on Rails no es algo completamente necesario, ya que Rails puede ocuparse de todo esto sin que tengamos que tocar la base de datos, pero a mi ver, es mejor que la base de datos haga lo que tiene que hacer.

El problema hasta ahora era que definir las foreign keys en una aplicación Rails era un poco engorroso. Había dos opciones: crear un fichero SQL con el código que creara las foreign keys, o crear unas migrations. La solución óptima desde luego serían las migrations, pero las migrations de Rails no nos proveen de ningún helper que nos ayude a crear las foreign keys de una forma rápida.

Aquí es donde aparece la gem protagonista del día, foreigner. Foreigner nos provee de helpers para poder crear nuestras foreign keys de una forma simple en nuestras migrations. Funciona con las bases de datos más utilizadas, MySQL, PostgreSQL y SQLite. Foreigner nos ofrece un método add_foreign_key y un método remove_foreign_key, que hacen justo lo que esperamos, crear una foreign key y eliminarla.

Con esto podemos definir nuestras foreign keys de una forma “bonita” en nuestras migrations sin ninguna complicación.

Enlace: Foreigner

ActiveRecord Import

En algunas ocasiones, en nuestras aplicaciones Rails, necesitamos guardar una cantidad más o menos grande de datos en la base de datos. Si creamos todos los objetos a guardar y después los guardamos uno a uno, dependiendo de la cantidad de objetos, tardaremos una cantidad de tiempo más o menos considerable. Esto es debido a que nuestra aplicación ejecutará una consulta de inserción para cada objeto que queramos crear, lo que no es nada eficiente.

Como solución a este problema, podemos utilizar la gem activerecord-import. Esta gem añadirá un método de clase import a nuestos modelos ActiveRecord, mediante el cual podremos guardar una cantidad grande de datos de una forma mucho más rápida.

Este método toma como argumentos dos arrays, uno con los nombres de los campos a rellenar, y otro con los datos a insertar. Este segundo array a su vez está formado por arrays, que contienen los valores para cada uno de los registros que deseemos insertar. Pongo un ejemplo para que quede un poco más claro.

def save_user_books(user,books)
  fields = [:user_id, :book_id]
  data = Array.new
  books.each do |book_id|
    item = Array.new
    item << user.id
    item << book_id
    data << item
  end
  UserBooks.import fields, data
end

Tenemos el método save_user_books cuyo fin es guardar una lista de registros en la tabla user_books. El método recibe un objeto user – user – y una lista de libros – books -. La tabla a tiene los campos user_id y book_id. Introducimos los nombres de los campos en un array – fields -. A continuación creamos un array con los registros a introducir – data -. Cada elemento de este array es a su vez un array – item -, en el que introduciremos los valores para los campos user_id y book_id.

Una vez creados los arrays fields y data llamamos al método import con estos arrays como parámetros.

Este método inserta todos los datos en la base de datos ejecutando una única consulta, lo que reduce considerablemente el tiempo de ejecución del método.

Aunque esta no sea una necesidad muy habitual, de esta manera podremos realizar las inserciones en la base de datos de una forma mucho más eficiente.

CKEditor

Últimamente no tengo mucho tiempo para dedicarle a nada que no sea trabajar, y mucho menos para dedicárselo al blog. Uno de los motivos era que no había conseguido poner ningún editor de texto enriquecido que funcionara correctamente, sobretodo cuando subía la aplicación a Heroku, por lo que tenía que escribir los posts en HTML, lo que me llevaba mucho tiempo adicional.

Pero el otro día navegando de un lado para otro me encontré con CKEditor, un editor de texto enriquecido que parece funcionar de forma bastante fácil con Rails. A pesar de funcionar bastante bien, la instalación no es precisamente intuitiva, sobretodo utilizando Rails 3.1 y haciendo la instalación en Heroku, así que os indico los pasos a seguir.

Lo primero es incluir el gem de CKEditor en nuestro Gemfile:

gem "ckeditor"

Después de hacer el consabido bundle install debemos descargar e instalar lo que es el CKEditor propiamente dicho, no la gem. Para esto ejecutamos lo siguiente:

rails generate ckeditor:install --path=public/assets

Esto descargará CKEditor y nos lo dejará en la ruta que le hemos indicado. Si utilizamos Rails 3.1 la ruta debe ser la que he puesto, public/assets.

Una vez hecho esto ya tenemos todo lo necesario para utilizar ckeditor en nuestra aplicación. Si queremos utilizar las opciones para subir ficheros, deberemos ejecutar algún comando más que está indicado perfectamente en la documentación, por lo que no lo voy a indicar.

Para incluir un editor en una de las páginas de nuestra aplicación debemos incluir el JavaScript de ckeditor:

<%= javascript_include_tag "/assets/ckeditor/ckeditor.js" %>

Una vez hecho esto ya podemos incluir un editor (o los que queramos) en la página, por ejemplo:

cktext_area_tag("blog_contenido", "Contenido del textarea")

Y eso es todo, con esto tenemos en nuestra aplicación un completo editor de texto enriquecido.

En la documentación podemos encontrar todas las opciones adicionales así como las distintas configuraciones que podemos utilizar.

Apotomo

Hace poco me han preguntado sobre la posibilidad de crear una web en la que los usuarios puedan tener múltiples widgets que colocar y gestionar a su gusto. Lo primero que me vino a la cabeza es una web como iGoogle, pero teniendo esto como ejemplo parece bastante complicado implementar algo así desde cero. Me puse a buscar por la web a ver si había alguna forma “sencilla” de implementar algo así para una aplicación Rails y me encontré con Apotomo, que es un framework para crear aplicaciones web con widgets con Rails.

Apotomo nos permite desarrollar widgets de una manera bastante cómoda, anidarlos y gestionar los mensajes entre ellos, y aunque inicialmente puede parecer un poco complicado, una vez lo vas entendiendo es bastante intuitivo.

En su web tienen screencasts, documentación y un tutorial bastante decente para enseñarnos cómo integrar widgets en nuestra aplicación, desde la base que son los objetos de los widgets, pasando por los controladores y las vistas.

Si estais pensando en desarrollar algo de este estilo desde luego Apotomo es una opción a tener muy en cuenta.