How to generate fixtures based on my development database?

后端 未结 3 1041
花落未央
花落未央 2021-02-05 04:07

I\'m lazy and I since my production database has data I could use for testing through on going development, I was wondering if there were any easy methods of ge

相关标签:
3条回答
  • 2021-02-05 04:39

    You really can Google this. "rails create fixture from database". First hit: http://snippets.dzone.com/posts/show/2525. But you will be generating what I think will be brittle tests. Consider using fixture replacements. Like Fixjour, Factory Girl, or Machinist. They will help you think about what kind of edge cases you are throwing at your code. Just a thought.

    0 讨论(0)
  • 2021-02-05 04:52

    In case you're creating a script to run under rails runner you can use the following approach:

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

    you can create as much blocks as you want, or if you want to go to the full database you can try:

    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
    

    if you do not want the timestamps you can change the code to: model.all.to_a.map { |m| m.attributes.except('created_at', 'updated_at')}.to_yaml

    0 讨论(0)
  • 2021-02-05 04:55

    The question is old, but as it still seems relevant: yes, there is an easy way to create fixtures from your development database:

    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
    

    Place this in a file in config/initializers - now you can dump any ActiveRecord object in your Rails console and it will automatically be appended at the end of it's respective fixture file:

    User.first.dump_fixture appends fixture data to test/fixtures/users.yml.

    0 讨论(0)
提交回复
热议问题