A set of tools to tidy up rails seeds.rb files.
Dibber has two compoments:
Seeder is designed to simplify the process of pulling attributes from YAML files, and populating ActiveRecord objects with those attributes.
ProcessLog provides Seeder with a simple before and after reporting tool.
Add this to your Gemfile:
gem 'dibber'
You have a rails app with a Thing model, and you want to seed it with some things. Thing instances have the attributes name, colour, size. You have a YAML file db/seeds/things.yml that looks like this:
foo: colour: red size: large bar: colour: blue size: small
Add this to your ‘db/seeds.rb’
Seeder = Dibber::Seeder Seeder.seed Thing puts Seeder.report
Then run ‘rake db:seed`
Seeder will create two new things.
You’ll then be able to do this:
thing = Thing.find_by(name: 'foo') thing.colour ---> 'red'
All of these are equivalent commands
Dibber::Seeder.seed Thing Dibber::Seeder.seed :thing Dibber::Seeder.seed 'Thing'
Seed content can also have dynamic content added via ERB. For example, if you want the colour of the foo thing to be either ‘red’ or ‘yellow’, change db/seeds/things.yml to
foo: colour: <%= ['red', 'yellow'].sample %> size: large
Then when we run ‘Dibber::Seeder.seed :thing` a new Thing will be created with the colour set to either ’red’ or ‘yellow’.
If you pass a block to .seed the block will be called on each object being built as it is created or updated.
So for example, if Thing has attributes size and big the following is possible:
Dibber::Seeder.seed(:thing) do |thing| thing.big = thing.attributes['size'] > 10 end
Seeder.report outputs a report detailing start and end time, and a log of how the number of things has changed
Seeder#build will not overwrite existing data unless directed to do so.
thing.update_attribute(:colour, 'black') Seeder.seed :thing thing.reload.colour ----> 'black' Seeder.seed(:thing, overwrite: true) thing.reload.colour ----> 'red'
Seeder.seed calls Seeder#build to build the objects defined in the seed files. You can call the build method directly if your seed file names do not match the class name:
Seeder.new(Thing, 'other_things.yml').build
Dibber can be used outside of Rails, but in this case you will need to specify the location of the seed files.
Seeder.seeds_path = "some/path/to/seeds"
You can also use this technique in Rails if you want to put your seed files in a folder other than ‘db/seeds’
Take a look at test/examples/seeds.rb for some more usage examples.
If you clone this app, you can run this example at the project root:
ruby test/examples/seeds.rb
There is also an example of process log usage:
ruby test/examples/process_logs.rb