Crear archivo de seed para Rails a partir de una Base de datos

En un proyecto en el que estoy trabajando - que aun esta “ya casi” de irse a producción - tuve la necesidad de pasar datos ya cargados en la base de datos de desarrollo en mi Mac a la base de datos de producción en el server. Esta información se fue capturando “ad-hoc” en desarrollo, por lo tanto hay archivos de texto ni nada de eso para cargar la información a producción.

Una opción pudo haber sido hacer un respaldo y cargarlo a producción, pero por restricciones en el server no puedo hacer eso. Y volver a capturar esa información a mano no es una opción para mi.

Así que me di una “vuelta” por RubyGems para que podia encontrar que me sirviera. Me encontre con seed_dump, que descarga la información de la Base de datos a un archivo de seed de Rails, que posteriormente puedo insertar en la Base de datos con un comando de rake.

Mi primer problema con seed_dump es que solo tiene soporte para Rails3, y no esta mal, pero mi aplicación es Rails 2.3.8. Después de inspeccionar el código unos minutos, no vi alguna dependencia real a Rails3, así que tome el archivo seed_dump.rake y lo copie a lib/tasks en mi aplicación de Rails. Ejecute el comando rake -T y ahi apareció la opción rake db:seed:dump, al parecer todo estaba bien.

Ejecute el comando para hacer el dump a seed y el archivo siempre me regresaba vacío. Volvi al código de seed_dump.rake y vi el problema, para descargar la información a partir de los modelos obtiene un listado de los modelos en el directorio models de la aplicación y luego con metaprogramacion crea una instancia del modelo y extrae la información en una consulta.

Dir[‘app/models/*.rb’].sort.each do |f|

Esto no funciona en mi aplicación, ya que los modelos están, en el directorio de cada uno de los plugins que la componen, y el comando de arriba solo busca en app/models de la aplicación.

Modificar la búsqueda para que revise en los directorios de los plugins no es una opción, en lugar de eso, con metaprogramacion debo tener un listado de las clases de mi aplicación y ver si estas clases tiene como super clase a Activerecord::Base, para entonces si proceder a crear una instancia y extraer los datos.

Después de unos minutos el archivo seed_dump.rake quedo como sigue y ahora si extrae los datos de la Base de datos a partir de mis modelos para crear un archivo seed.