20

我已经看到一些插件和自定义 rake 任务将活动数据库转储到固定装置,但我不确定流行的技术是什么。

基本上,我想要 rake:db:fixtures:load 的反面,这样我就可以在部署时将基本的 db 信息(一个是管理员用户帐户)放入 svn 中。我不想为需要很长时间的样本数据等手动创建固定装置。

当我们部署时,我希望能够运行

rake db:migrate
rake db:fixtures:load

并参加比赛。

在 Rails 中执行此操作的最佳/首选方法是什么?

编辑:

所以似乎没有标准的方法来执行 db:fixtures:load 的相反 rake 任务。

我不想使用迁移,因为我想要为我的所有项目执行此操作的标准方式,而且我不喜欢将管理员帐户放入迁移中的想法。其次,我一直在重新考虑使用固定装置的想法。我决定使用 yaml_db 因为它使用 rake 任务:

rake db:data:dump
rake db:data:load

数据将在 YAML 文件中结束,而不会破坏测试装置(这可能会有所不同,现在我更仔细地考虑了这一点)。此外,如果像 Heroku 这样的主要分发工具正在使用它,我不必担心支持/寿命问题。

我想这最接近我会发现的“标准”。

感谢所有伟大的回应。

4

6 回答 6

14

听起来您应该使用 db/seeds.rb 和相关的 rake db:seed 任务。这些是专门为加载种子数据而设计的。然后,您可以调用YamlDB 以加载数据并 rake db:data:dump_dir 将所有固定装置转储到临时目录并根据需要将它们复制到您的种子数据目录。

请注意,这不适用于转储装置,因为 YAML 格式不同。上面提到的 ar_fixtures 不适用于 Rails 3,并且似乎不再受支持。对于转储装置,您可能想在 lib/tasks/dump_fixtures.rake 中尝试类似的操作:

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s"
      skip_tables = ["schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", '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
  end
end

我在这里找到了这个并为 Rails3 稍微修改了它。

于 2012-08-30T01:37:38.637 回答
10

Heroku 使用 YamlDB Gem

http://www.github.com/ludicast/yaml_db/tree/master

于 2009-08-25T13:59:37.160 回答
2

没有标准的方法来做到这一点。只有一种标准的方式来加载夹具:

rake db:fixtures:load

但是网上有很多例子:

于 2009-08-25T16:39:26.420 回答
1

它不使用与 db:fixtures:load 所期望的完全相同的格式,但是ar_fixtures使得将数据作为 YAML 文件转储和加载非常容易。

于 2009-08-25T04:48:42.473 回答
1

我认为如果是标准管理员信息,您最好将其放入迁移中。理想情况下,夹具应仅用于测试。

于 2009-08-25T16:33:20.520 回答
1

对于现在才发现这个的其他人,我稍微修改了@jpgeek 的答案。将表格包含schema_migration在忽略列表中并按 ID 排序,因此我得到的输出table_name_001ID=1

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s ORDER BY ID"
      skip_tables = ["schema_info", "schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", '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
  end
end
于 2014-01-24T09:01:20.033 回答