Rails: carga inicial de la base de datos

25
Octubre
2006

Muchas veces es deseable que la base de datos de una aplicación se inicialice con ciertos valores prefijados (por ejemplo una lista de provincias o una lista de distribuciones de teclado). En Rails una opción es rellenar la base de datos desde las migraciones (¿estáis utilizando migraciones verdad?) pero esto hace que los datos se encuentren ocultos en los archivos de migración, lo que a veces no es comodo. Otra opción es abusar de Rails y utilizar la tarea de Rake db:load:fixtures y utilizar las fixtures de las pruebas para inicializar la base de datos, lo que simplemente está mal, porque el entorno de pruebas debe ser exhaustivo, cosa que seguramente nuestros datos reales no lo sean.

La última solución es buscarse un poco la vida: la idea es generar un conjunto de fixtures alternativos y cargarlos cuando deseemos inicializar la base de datos. Este conjunto de fixtures he decidido almacenarlos en lib/fixtures por la simple razón de que no encontré lugar mejor donde ponerlos. Sólo nos queda crear dos archivos:

# lib/load_initial_fixtures.rb
require ‘active_record/fixtures’

# Carga del directorio lib/fixtures los archivos de datos iniciales del
# vector fixtures.
def load_initial_fixtures(fixtures)
  fixtures.each do |fixture|
    Fixtures.create_fixtures(File.join(RAILS_ROOT, ‘lib’, ‘fixtures’), fixture)
  end
end

# lib/tasks/db_initial_load.rake
require ‘load_initial_fixtures’

namespace :db do
  namespace :initial do
    desc ‘Restaura la base de datos a los valores iniciales’
    task :load => :environment do
      fixtures = ENV['FIXTURES'].nil? ? nil : ENV['FIXTURES'].split(’ ‘)
      fixtures ||= %w( tablas que se quieren inicializar )

      load_initial_fixtures(fixtures)
    end
  end
end

Con estos dos archivos podemos almacenar nuestros YAML de inicialización en lib/fixtures y escribir rake db:initial:load (se puede especificar que sólo se cargen ciertas tablas mediante el parámetro FIXTURES).

La función que realiza la carga de las fixtures en la base de datos está separada en una función independiente por si se desea invocar el código desde la aplicación es sí (CWT).

Lo único malo de este método respecto al de las utilizar las migraciones es que las fixtures tendrán que ser modificadas si se modifica alguna estructura de la base de datos que las afecte a ellas (al igual que hay que modificar las fixtures para las pruebas).


Deja un comentario

Puedes enterarte de las respuestas a tus comentarios de esta entrada mediante myComments.

XHTML: Puedes utilizar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tu servidor sin límites: 20GB de espacio, 1TB de transferencia, 1 dominio gratuito. Por 1.5€ al mes utilizando el código "RUIDOBLANCO" en DreamHost. Más información.