Starting a Ruby on Rails project from existing data
Ideally when you are starting a Ruby on Rails project you’re starting from scratch and most tutorials and guides you’ll find on the Internet assume this. I found very little information about starting a project from existing data and I thought I’d share the solution which I found and consider the simplest.
So, we’re supposing the already existing database is called library_development and you can access it with the joe user having password secret and that you have created a new rails app which should be able to connect to a mysql database.
The first thing you should do is configure your database, by editing the development section of config/database.yml to look something like the following (please note that the highlighted lines have the same values as above):
development: adapter: mysql2 encoding: utf8 reconnect: false database: library_development pool: 5 username: joe password: secret socket: /var/run/mysqld/mysqld.sock
You are now ready to dump the schema (structure) of your database by issuing:
This will generate db/schema.rb. Now you need to copy the contents of this file and save it as your first migration. So let’s create an empty migration file. Run:
rails generate migration create_database_structure
Move the contents of db/schema.rb into the up method of this first migration. Now whenever you will run your migration the database’s structure will be created. But the database will still be empty. So let’s populate it with your existing data.
I found the best option for this task to be the yaml_db gem. Let’s add it to your project. Edit your Gemfile and add the following line:
The yaml_db gem should now be installed. Try running:
If all goes well you should have a db/data.yml file containing your data. Now we want to restore this data by a migration, so let’s create your second migration:
rails generate migration import_data
This second migration’s up method should be the following:
And you’re all set!
Take a deep breath and reset your existing database and run the migrations. If by any chance something goes horribly wrong you still have the original database dump file stored somewhere safe, right?
Tadaaa, your database should look just as it did before you reset it.
Now you can go ahead and create your models. Bonus tip: once you created your models, use the annotate gem to add the structure of the associated tables as handy comments at the beginning of your model files.
PS. As a test, I also posted this article to Medium.