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
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.
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
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
.