J'ai des données dans ma base de données de développement que j'aimerais utiliser comme éléments fixes dans mon environnement de test. Quel est le meilleur moyen dans Rails 2.x d’exporter une table de base de données vers un appareil YAML?
Il y a une tâche de rake pour cela. Vous pouvez spécifier Rails_ENV si nécessaire. la valeur par défaut est l'environnement de développement:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
J'utilise YamlDb pour enregistrer l'état de ma base de données.
Installez-le avec la commande suivante:
script/plugin install git://github.com/adamwiggins/yaml_db.git
Utilisez la tâche rake pour vider le contenu de la base de données Rails vers db/data.yml
rake db:data:dump
Utilisez la tâche rake pour charger le contenu de db/data.yml dans la base de données.
rake db:data:load
Ceci est la page d'accueil des créateurs:
http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/
Ce plugin va ajouter la fonctionnalité que vous voulez. Il a été extrait d’ActiveRecord et ne vient donc plus par défaut.
script/plugin install http://github.com/topfunky/ar_fixtures
Puis lancez:
rake db:fixtures:dump MODEL=ModelName
Pour Rails 3, si vous voulez vider yaml de la base de données et l’utiliser en tant que fixture, j’utilise le code suivant:
module DbToFixture
TEMP_FIXTURE_PATH = Rails.root.join("test", "new_fixtures")
def fixturize(model)
Dir.mkdir(TEMP_FIXTURE_PATH) unless File.exists?(TEMP_FIXTURE_PATH)
fname = model.table_name
file_path = TEMP_FIXTURE_PATH.join(fname)
File.open(file_path, 'w') do |f|
model.all.each do |m|
f.write(m.to_yaml)
end
end
end
end
Je viens de le lancer depuis la console avec
require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName
Je n'ai pas réussi à faire fonctionner ar_fixtures avec Rails 3 (je n'ai pas vraiment essayé). Yaml db est idéal pour la sauvegarde et l’enregistrement de la base de données, mais son format n’est pas compatible avec les appareils.
Iron Fixture Extractor a été construit dans ce but précis. Cela convient particulièrement aux situations dans lesquelles vous souhaitez utiliser différents ensembles de montages pour différents scénarios de test (plutôt que d'avoir tous les montages pour tous les tests). Il fournit des fonctionnalités pour extraire, charger, reconstruire des fixtures, tronquer des tables ou capturer des hachages particuliers de vos fichiers yaml de fixture.
Une gemme très simple créera des fixtures Yaml à partir d'une base de données existante ...
Fonctionne avec Rails 4.
rake db:fixtures:dump
a été changé en
rake db:extract_fixtures
Voici une tâche de rake qui fera exactement cela (testé dans Rails 3.2.8):
namespace :db do
task :extract_fixtures => :environment do
sql = 'SELECT * FROM "%s"'
skip_tables = ["schema_migrations"]
ActiveRecord::Base.establish_connection
if (not ENV['TABLES'])
tables = ActiveRecord::Base.connection.tables - skip_tables
else
tables = ENV['TABLES'].split(/, */)
end
if (not ENV['OUTPUT_DIR'])
output_dir="#{Rails.root}/test/fixtures"
else
output_dir = ENV['OUTPUT_DIR'].sub(/\/$/, '')
end
(tables).each do |table_name|
i = "000"
File.open("#{output_dir}/#{table_name}.yml", 'w') do |file|
data = ActiveRecord::Base.connection.select_all(sql % table_name.upcase)
file.write data.inject({}) { |hash, record|
hash["#{table_name}_#{i.succ!}"] = record
hash
}.to_yaml
puts "wrote #{table_name} to #{output_dir}/"
end
end
end
end
Source: http://sachachua.com/blog/2011/05/Rails-exporting-data-specific-tables-fixtures/
Remarque: j'ai dû apporter quelques modifications au code du blog pour le rendre plus compatible avec les bases de données croisées et fonctionner dans Rails 3.2.
> Rails c
irb> puts Modelname.all.to_yaml
puis copiez-le et collez-le dans un fichier et modifiez-le pour l'adapter à vos attentes.
C'est du travail manuel, mais si vous en avez besoin une seule fois, c'est probablement le moyen le plus rapide.
Pour le vidage des appareils de test rspec/concombre dans Rails 3, voici la meilleure réponse que j'ai trouvée: Quelle est la méthode standard pour vider les appareils db en yml dans des rails?