LONERさんのブログ
ブログ
fixture を DB から出力
『ar_fixturesはRails3では動かなかった+代替方法』http://d.hatena.ne.jp/elm200/20070928/1190947947, 『DBからYAMLにする方法』http://d.hatena.ne.jp/DianthuDia/20080827/1219798117, 『データベースからテストフィクスチャを抽出する』http://d.hatena.ne.jp/elm200/20070928/1190947947 を見て、fixtureを同じように自動生成してみた。
コードを読まずに単に貼り付けて実行しただけ。・・・するとエラー発生。
id を便りに並び順を指定しているので、id のない scheme_migration のテーブルでエラー。それから、DBにセッションを入れている場合は sessions テーブルも除外が必要になります。さらに、モデルが存在しないテーブルも除外が必要になります。
いろいろとエラーが出るので、出力のときにエラーが出ても abort しないようにしました。
def fixture_entry(table_name, obj)
res = []
klass = table_name.singularize.camelize.constantize
res << "#{table_name.singularize}#{obj['id']}:"
klass.columns.each do |column|
res << " #{column.name}: #{obj[column.name]}"
end
res.join("\n")
end
namespace :db do
fixtures_dir = "#{RAILS_ROOT}/tmp/fixtures/"
namespace :fixtures do
desc "Extract database data to the tmp/fixtures/ directory. Use FIXTURES=table_name[,table_name...] to specify table names to extract. Otherwise, all the table data will be extracted."
task :extract => :environment do
sql = "SELECT * FROM %s ORDER BY id"
skip_tables = ["schema_migrations", "sessions"]
ActiveRecord::Base.establish_connection
FileUtils.mkdir_p(fixtures_dir)
if ENV['FIXTURES']
table_names = ENV['FIXTURES'].split(/,/)
else
table_names = (ActiveRecord::Base.connection.tables - skip_tables)
end
table_names.each do |table_name|
puts table_name
begin
File.open("#{fixtures_dir}#{table_name}.yml", "w") do |file|
objects = ActiveRecord::Base.connection.select_all(sql % table_name)
objects.each do |obj|
file.write fixture_entry(table_name, obj) + "\n\n"
end
end
rescue => e
puts "error: " << e.message
end
end
end
end
end
使っているrails のバージョンが古い(ruby 1.8.7, rails 3.1)ので、factorygirl が使えないのでした。
コメントを書く
コメントを投稿するには、ログイン(無料会員登録)が必要です。