seeder
Seeder provides a way for your app to plant seed data in its database. A primary benefit of using this gem is that it gives you an easy way to manage updating and deleting seed data, in addition to just creating it.
Install
gem install seeder
Motivation
Seed data refers to data stored in your database that is not generated
dynamically through your application. You can generate your seed data via
rake db:seed
, which runs the contents of your db/seeds.rb
file.
Generating seed data is easy enough. But as your application grows and changes, you may find that you need to modify existing seed data.
You could run migrations to modify seed data, but you would need to make sure to adjust the seeds.rb file in a consistent way. It is very easy to forget to do this, or to make a mistake along the way.
Seeder allows you to manage all of your seeds via the seeds.rb file, without needing to use migrations when you have to change existing seed data.
You provide a set of attributes associated with your seed data for a given model. You also specify which attributes of the model should be treated as "identifying attributes" - that is, which attributes should be used to determine if an existing database row needs to be updated, or if a new row needs to be added. Seeder then synchronizes the contents of the database table to the attributes it is given.
Usage
Suppose you have a DataField
model, with attributes data_type
, name
, and
description
.
To seed your database with a couple data fields, you would just include the following in your seeds.rb file:
seeds = [
{ data_type: "Oil", name: "btu", description: "Oil usage" },
{ data_type: "Water", name: "gallons", description: "Water usage" }
]
Seeder.create(seeds, [:data_type, :name], DataField)
In the example above, the data_type
and name
attributes will be used to
identify records that already exist in the database. The first time you seed
data, there are no existing records so two new records will be created. If you
re-seed the database, Seeder will not do anything, since the records already
exist in the database, and no attributes have changed.
Suppose the database has already been seeded, and you decide to change the
description of the Oil btu data field. All you need to do is update the
seeds.rb file and rerun the db:seed
Rake task. Seeder will know to update the
existing database record associated with Oil btu:
seeds = [
{ data_type: "Oil", name: "btu", description: "Fuel oil usage" },
{ data_type: "Water", name: "gallons", description: "Water usage" }
]
Seeder.create(seeds, [:data_type, :name], DataField)
If you then want to add an Oil therms DataField record to the db, you could just add a line to your seeds.rb file:
seeds = [
{ data_type: "Oil", name: "btu", description: "Fuel oil usage (btu)" },
{ data_type: "Oil", name: "therms", description: "Fuel oil usage (therms)" },
{ data_type: "Water", name: "gallons", description: "Water usage" }
]
Seeder.create(seeds, [:data_type, :name], DataField)
The above code would adjust the description of the existing Oil btu database row, and create a new one for Oil therms.
Now let's say you changed your mind and decided that you don't need an Oil therms entry in the database. You could just delete the corresponding row from seeds.rb, and Seeder will know to delete that entry from the database.
License
See LICENSE.txt