Skip to content

Instantly share code, notes, and snippets.

@wrtsprt
Forked from ecleel/db_fixtures_dump.rake
Created January 18, 2021 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wrtsprt/afb99a3fc3d84df243e25926f0a9d9b4 to your computer and use it in GitHub Desktop.
Save wrtsprt/afb99a3fc3d84df243e25926f0a9d9b4 to your computer and use it in GitHub Desktop.
Rails 5: Dump Rails db to fixtures
# Original from http://snippets.dzone.com/posts/show/4468 by MichaelBoutros
#
# Optimized version which uses to_yaml for content creation and checks
# that models are ActiveRecord::Base models before trying to fetch
# them from database.
namespace :db do
namespace :fixtures do
desc 'Dumps all models into fixtures.'
task :dump => :environment do
models = Dir.glob(Rails.root + 'app/models/**.rb').map do |s|
Pathname.new(s).basename.to_s.gsub(/\.rb$/,'').camelize
end
# excludes models
excludes = %w(ApplicationRecord)
puts "Found models: " + models.join(', ')
models.reject{|m| m.in?(excludes)}.each do |m|
model = m.constantize
next unless model.ancestors.include?(ActiveRecord::Base)
puts "Dumping model: " + m
entries = model.order(id: :asc).all
increment = 1
model_file = "#{Rails.root}/test/fixtures/#{m.underscore.pluralize}.yml"
File.open(model_file, 'w') do |f|
entries.each do |a|
attrs = a.attributes
attrs.delete_if{|k,v| v.blank?}
output = {m + '_' + increment.to_s => attrs}
f << output.to_yaml.gsub(/^--- \n/,'') + "\n"
increment += 1
end
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment