Hopp til innholdet

cjohansen.no

Oppdatering: Testdata/Utvikling/Rails

Etter å ha brukt rake-oppgaven som beskrevet i Testdata under utvikling i Rails samtidig som pågående prosjekt har vokst har jeg støtt på et lite problem med den. Her er fiksen.

Problemet

Problemet bunner i denne linja:

Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each ...

Hvis du har laget databasen din på en forsvarlig måte, med indekser og fremmednøkler, tabellene dine ikke avhenger av hverandre på en alfabetisk måte så har du et problem. Siden linja over henter filene i den rekkefølgen de ligger på filsystemet i (sannsynligvis alfabetisk) har du ingen kontroll over at avhengighetene blir lastet inn i databasen i riktig rekkefølge.

Løsningen

Løsningen er enkel nok: åpne for et parameter til rake-oppgaven som angir rekkefølge på yml-filene:

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    if ENV.include?('fixtures')
      fixtures = ENV['fixtures'].split(',').collect { |fix| fix + '.yml' }
    else
      fixtures = Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml')
    end

    require 'active_record/fixtures'

    fixtures.each do |file|
      puts 'Processing: ' + File.basename(file, '.*')
      Fixtures.create_fixtures('db/fixtures', File.basename(file, '.*'))
    end
  end
end

Dermed kan oppgaven enten kjøres som rake db:seed, og den vil laste inn fiksturene i vilkårlig rekkefølge, eller du kan kjøre den som: rake db:seed people,companies når du trenger å styre rekkefølgen.

Muligens relatert

2006 - 2012 Christian Johansen Creative Commons Lisens