Importación masiva de imágenes con FileColumn
Después de poner en línea el Jujuy Al Día, incluyendo la importación de los contenidos heredados de su base de datos de los últimos 6 años, la próxima deuda pendiente era hacer lo mismo con las más de 1000 imágenes y fotografías con las que se ilustraban gráficamente igual cantidad de noticias. La idea era tomar las imágenes originales e "importarlas" en los 4 tamaños definidos al correspondiente atributo FileColumn del modelo de las noticias, lo más automáticamente posible...
Primero que todo, tener cada imágen disponible en 4 tamaños es necesario por los requerimientos del nuevo diseño del sitio. Por eso mismo, y por la cantidad de imágenes en cuestión, se me hizo evidente que lo mejor era realizar directamente la actualización de los objetos ActiveRecord de las noticias correspondientes a las imágenes a importar, usando de alguna manera el archivo ".jpg" como el nuevo valor del atributo FileColumn y dejar que ese práctico plugin hiciera el resto.
Determinar si ésta idea podía hacerse realidad fué fácil revisando el mismo código fuente de FileColumn, que en su archivo lib/filecolumn.rb dice claramente sus líneas 46 a 52 (para el método assign):
"Esto no vino de una solicitud CGI. Sin embargo, asignar los archivos directamente puede ser útil".
Con este esclarecedor dato la importación en sí directamente desde el sistema de archivos puedo hacerse con la siguiente expresión:
story.update_attribute(:image, File.new("#{RAILS_ROOT}/tmp/photos/#{f}"))
Donde "image" es el atributo definido como FileColumn y "f" es el archivo actual en el directorio tmp/photos a importar.
Como la actualización de la tabla de noticias debía hacerse dentro del entorno de Rails para tomar ventaja del modelado de ActiveRecord y más especialmente de FileColumn, lo más adecuado fué escribir una tarea Rake para la aplicación, de tal manera que la importación de las imágenes fuera tan fácil como escribir:
rake import_legacy_photos RAILS_ENV=production
Moraleja
Si en Rails algo parece difícil al principio, ¡es porque desconocemos la verdadera manera de hacerlo bien!