3

我需要用特定表中的数据填充我的生产数据库应用程序。这是在任何人甚至触及应用程序之前。在开发模式下也需要此数据,因为它是测试所必需的。Fixtures 通常是测试数据的方式,但是 Ruby on Rails 在创建数据库时也将这些数据传送到实时数据库的“最佳实践”是什么?

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

1) 将测试数据加载到我的数据库中进行开发的最佳方式是什么,这将是大约 1,000 项。是通过迁移还是通过固定装置?这是与下面的问题不同的答案的原因是,在开发过程中,我想让表格中的某些字段随机化。在生产环境中,这些字段都将以相同的值 0 开始。

2)用我需要的实时数据引导生产数据库的最佳方法是什么,这也是通过迁移还是固定?

我认为答案是按照此处所述进行播种:http: //lptf.blogspot.com/2009/09/seed-data-in-rails-234.html但我需要一种为开发播种和为生产播种的方法。另外,如果可以播种,为什么还要使用 Fixtures?一粒种子什么时候使用,什么时候使用固定装置?

4

2 回答 2

3

通常,fixture 用于为您的测试提供数据,而不是将数据填充到数据库中。你可以——有些人有,比如你指向的链接——为此目的使用固定装置。

Fixtures 没问题,但是使用 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 运行这些脚本以加载(并因此运行)该目录中的脚本。

现在这只为您提供了部分数据库样式迁移。从这里开始创建这些数据迁移只能运行一次的东西并不难(比如数据库迁移)。

您的需求可能停留在引导程序:我们有非常独特的需求(在我们只了解一半规范的情况下开发系统,大型 Rails 团队,从上一代软件迁移大数据。您的需求可能更简单)。

于 2010-05-06T02:19:27.260 回答
0

如果您确实想使用固定装置,那么与种子相比,您还可以轻松导出。

快速猜测 rake 任务的外观如下

  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
于 2010-05-06T14:07:16.917 回答