2010-05-06 36 views
3

我需要使用特定表中的数据填充我的生产数据库应用程序。这是在任何人甚至触及应用程序之前。这些数据在开发模式中也是必需的,因为它需要进行测试。固定装置通常是测试数据的方式,但是在创建数据库时,Ruby on Rails将这些数据发送到实时数据库的“最佳实践”是什么?Ruby on Rails 2.3.5:使用数据填充我的prod和devel数据库(迁移或夹具?)

最终,这是一个两部分问题,我想。

1)将测试数据加载到我的数据库进行开发的最佳方式是什么,这大概是1,000个项目。是通过移植还是通过固定装置?这是一个与以下问题不同的答案,原因是在开发过程中,表中有一些我想随机创建的字段。在生产中,这些字段都将以相同的值0开始。

2)什么是使用实时数据引导生产数据库的最佳方式我需要它,这是否也通过迁移或夹具?

我认为答案是这里描述的种子:http://lptf.blogspot.com/2009/09/seed-data-in-rails-234.html但我需要一种种子发展和种子生产的方式。另外,如果播种可用,为什么还要使用Fixtures?什么时候种子和什么时候使用装置?

回答

3

通常使用固定装置来为您的测试提供数据,而不是将数据填充到数据库中。你可以 - 而且有些人像你指向的链接那样使用夹具来达到这个目的。

灯具正常,但使用Ruby给了我们一些优势:例如,能够读取CSV文件并根据该数据集填充记录。或者如果您真的想从YAML夹具文件中读取数据:自从您开始使用编程语言后,您的选择将从此处开放。

我当前的团队尝试使用db/seed.rb,并检查RAILS_ENV以仅在某些地方加载某些数据。

关于db:seed的令人讨厌的事情是,它意味着一个镜头:所以如果你在开发过程中添加了额外的项目 - 或者当你的应用程序已经达到产量时...... ...那么你需要考虑到这一点(ActiveRecord的find_or_create_by ...()方法可能是你的朋友)。

我们尝试了Bootstrapper插件,该插件在RAILS_ENV检查中放置了一个很好的DSL,并让您只运行所需的环境。这很好。

我们的需求实际上超出了我们的需要 - 我们发现我们需要数据库样式迁移来处理我们的种子数据。现在我们将普通的Ruby脚本放到一个文件夹(db/bootstrapdata /)中,并使用Arild Shirazi的gem运行这些脚本来加载(并因此运行)该目录中的脚本。

现在这只给你一部分数据库风格的迁移。从此创建一些只能运行一次的数据迁移(如数据库迁移)并不难。我们有非常独特的需求(当我们只知道规格的一半时,开发系统,larg-ish Rails团队,从上一代软件进行大数据迁移,您的需求可能会更简单) 。

0

如果你确实想使用灯具,那么种子的优势在于你可以轻松导出。

如何耙任务可能看起来如下

desc 'Export the data objects to Fixtures from data in an existing 
    database. Defaults to development database. Set RAILS_ENV to override.' 
    task :export => :environment do 
    sql = "SELECT * FROM %s" 
    skip_tables = ["schema_info"] 
    export_tables = [ 
     "roles", 
     "roles_users", 
     "roles_utilities", 
     "user_filters", 
     "users", 
     "utilities" 
    ] 

    time_now = Time.now.strftime("%Y_%h_%d_%H%M") 
    folder = "#{RAILS_ROOT}/db/fixtures/#{time_now}/" 
    FileUtils.mkdir_p folder 
    puts "Exporting data to #{folder}" 

    ActiveRecord::Base.establish_connection(:development) 
    export_tables.each do |table_name| 
     i = "000" 
     File.open("#{folder}/#{table_name}.yml", 'w') do |file| 
     data = ActiveRecord::Base.connection.select_all(sql % table_name) 
     file.write data.inject({}) { |hash, record| 
      hash["#{table_name}_#{i.succ!}"] = record 
      hash }.to_yaml 
     end 
    end 
    end 

    desc "Import the models that have YAML files in 
    db/fixture/defaults or from a specified path." 
    task :import do 
    location = 'db/fixtures/default' 
    puts "" 
    puts "enter import path [#{location}]" 
    location_in = STDIN.gets.chomp 
    location = location_in unless location_in.blank? 
    ENV['FIXTURES_PATH'] = location 
    puts "Importing data from #{ENV['FIXTURES_PATH']}" 
    Rake::Task["db:fixtures:load"].invoke 
    end 
快速猜测