Rails: what does schema.rb do?
Ruby on-RailsActiverecordRuby on-Rails Problem Overview
I used to think the db/schema.rb
in a Rails
project stored the database schema, so that ActiveRecord
can know what table/column it has.
But earlier I surprisingly noticed that my project runs normally after I delete db/schema.rb
!
So, since the Rails
can work without it, what does schema.rb
really do?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
The schema.rb
serves mainly two purposes:
-
It documents the final current state of the database schema. Often, especially when you have more than a couple of migrations, it's hard to deduce the schema just from the migrations alone. With a present
schema.rb
, you can just have a look there. ActiveRecord itself will indeed not use it. It will introspect the database during runtime as this is much safer than to expect users to keep theschema.rb
up-to-date. However to avoid confusion of your developers, you should always maintain a file that is up-to-date with your migrations. -
It is used by the tests to populate the database schema. As such a
rake db:schema:dump
is often run as part of the raketest:prepare
run. The purpose is that the schema of the test database exactly matches the current development database.
Solution 2 - Ruby on-Rails
Rails Documentation / 6.1 What are Schema Files for?
> > Migrations, mighty as they may be, are not the authoritative source > for your database schema. That role falls to either db/schema.rb or an > SQL file which Active Record generates by examining the database. They > are not designed to be edited, they just represent the current state > of the database. > > There is no need (and it is error prone) to deploy a new instance of > an app by replaying the entire migration history. It is much simpler > and faster to just load into the database a description of the current > schema. > > For example, this is how the test database is created: the current > development database is dumped (either to db/schema.rb or > db/structure.sql) and then loaded into the test database. > > Schema files are also useful if you want a quick look at what > attributes an Active Record object has. This information is not in the > model's code and is frequently spread across several migrations, but > the information is nicely summed up in the schema file. The > annotate_models gem automatically adds and updates comments at the top > of each model summarizing the schema if you desire that functionality. >