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.