如何基于我的开发数据库生成灯具?

时间:2011-07-06 04:55:57

标签: ruby-on-rails

我很懒,因为我的生产数据库有我可以用来测试开发的数据,我想知道是否有任何 easy 方法来生成灯具。

在1.8.7上使用Rails 3

4 个答案:

答案 0 :(得分:23)

问题是陈旧的,但仍然看似相关:是的,有一种从开发数据库创建灯具的简单方法:

class ActiveRecord::Base
  def dump_fixture
    fixture_file = "#{Rails.root}/test/fixtures/#{self.class.table_name}.yml"
    File.open(fixture_file, "a+") do |f|
      f.puts({ "#{self.class.table_name.singularize}_#{id}" => attributes }.
        to_yaml.sub!(/---\s?/, "\n"))
    end
  end
end

将其放在config/initializers中的文件中 - 现在您可以在Rails控制台中转储任何ActiveRecord对象,它将自动附加到它的相应夹具文件的末尾:

User.first.dump_fixture将夹具数据附加到test/fixtures/users.yml

答案 1 :(得分:0)

如果要创建要在rails runner下运行的脚本,则可以使用以下方法:

File.open("#{Rails.root}/spec/fixtures/documents.yml", 'w') do |file|
  file.write Document.all.to_a.map(&:attributes).to_yaml
end

您可以根据需要创建任意数量的块,或者如果要转到完整的数据库,则可以尝试:

models = defined?(AppicationRecord) ? ApplicationRecord.decendants : ActiveRecord::Base.descendants
models.each do |model|
  model_name = model.name.pluralize.underscore
  File.open("#{Rails.root}/spec/fixtures/#{model_name}.yml", 'w') do |file|
    file.write model.all.to_a.map(&:attributes).to_yaml
  end
end

如果您不希望使用时间戳记,则可以将代码更改为: model.all.to_a.map { |m| m.attributes.except('created_at', 'updated_at')}.to_yaml

答案 2 :(得分:0)

基于@nikolasgd 的回答,我写了一个 Rake Task,它可能对某些人有用:

# Use like "rake custom:create_test_fixtures[model]"
namespace :custom do
  desc 'Re-Creates Fixtures for Testing for a Model'

  task :create_test_fixtures, [:model] => [:environment] do |t, args|
    class ActiveRecord::Base
      def dump_fixture
        fixture_file = "#{Rails.root}/test/fixtures/#{self.class.table_name}.yml"
        File.open(fixture_file, "a+") do |f|
          f.puts({"#{self.class.table_name.singularize}_#{id}" => attributes}.
              to_yaml.sub!(/---\s?/, "\n"))
        end
      end
    end

    begin
      model = args[:model].constantize
      model.all.map(&:dump_fixture)
      puts "OK: Created Fixture for Model \"#{args[:model]}\"."
    rescue NameError
      puts "ERROR: Model \"#{args[:model]}\" not found."
    end

  end
end

答案 3 :(得分:-11)

你真的可以Google这个。 “rails从数据库创建夹具”。第一击:http://snippets.dzone.com/posts/show/2525。但是你会产生我认为是脆弱的测试。考虑使用夹具更换。与FixjourFactory GirlMachinist一样。它们将帮助您思考您在代码中抛出的边缘情况。只是一个想法。