Idempotent seeds in rails
Database seeds are a very handy tool in rails.
They ease setting up a proper development environment with meaningful data.
One issue with the out of the box seeds is though that they are not
idempotent per se.
While developing an application you don’t want to always reset the database
to get a proper seed state. If the seeds were idempotent,
you could run rake db:seed
as many time as you’d like without
corrupting the integrity of your data. Just as migrations,
running the seeds should only update your database if necessary.
A simple helper method helps creating idempotent data easily.
- The first argument
model
is the model class - The second argument
find_or_create_by
is a hash of attributes that are used for finding a record. If the record doesn’t exist, it will be created. This hash is like the unique identifier of a seed record. - The third argument
update_with
is a hash of attributes that will be always set on the record, whether the record already exists or has to be created. This is useful when the seeds are extended and you want to update existing records with new attributes.
The actual seed could look something like this.
That’s it. Now execute rake db:seed
a few times to get back your confidence in your seeds.