Radio Bantik:
Days in the Life of an Alpha Geek

Radio Bantik is an alpha-geek blog covering topics in Mac OS X, software and web development including Ruby on Rails, Java, Cocoa, and WebObjects, corporate survival, LEGO robotics, and other stuff important in the life of a technologist.

Using Faker to Pre-Populate a Dev Database

Posted February 4th, 2008 in Development, Ruby on Rails | Permanent Link

I’m currently working on a project to create a travel website, and I needed to have a bunch of member profiles to use for testing the member directory. I came across a great Ruby gem called Faker which I’ve used to create the dummy accounts.

Installation is easy, of course: gem install Faker

Next, I created a Rake task for populating the accounts:

namespace :db do
  namespace :development do
    desc "Create user records in the development database."

    task :fake_user_data => :environment do
      require 'faker'

      @countries = ["United States", "Canada", "United Kingdom", "Germany", "Mexico"]
      @genders = ["Male","Female"]
      @privacy = ["members", "public"]

      def randomDate(params={})
        years_back = params[:year_range] || 5
        latest_year  = params [:year_latest] || 0
        year = (rand * (years_back)).ceil + (Time.now.year - latest_year - years_back)
        month = (rand * 12).ceil
        day = (rand * 31).ceil
        series = [date = Time.local(year, month, day)]
        if params[:series]
          params[:series].each do |some_time_after|
            series << series.last + (rand * some_time_after).ceil
          end
          return series
        end
        date
      end

      100.times do

        u = User.new(
          :first_name => Faker::Name.first_name,
          :last_name => Faker::Name.last_name,
          :birthdate => randomDate(:year_range => 60, :year_latest => 22),
          :created_at => randomDate(:year_range => 4, :year_latest => 0),
          :city => Faker::Lorem.words(1).to_s.capitalize,
          :state => Faker::Address.us_state(),
          :country => @countries.rand.to_s,
          :password => “greatpasswordhuh”,
          :password_confirmation => “greatpasswordhuh”,
          :accepts_terms_and_conditions => true,
          :gender => @genders.rand.to_s,
          :email => Faker::Internet.email
        )

        u.extended_profile = ExtendedProfile.new(
          :bio => Faker::Lorem.sentences(5).join(” “),
          :occupation => Faker::Lorem.words(1).to_s.capitalize
        )

        u.preferences = Preferences.new()
        u.save!

      end
    end
  end
end

Note that while Faker was good for creating random names, e-mail addresses, etc., I needed some other data that was outside of its scope, for example gender and country. For these, I simply created an array (like @genders = ["Male","Female"]) and called @genders.rand to pick a value. I also used its Lorem Ipsum generator to create random city names, occupations, and biographical text.

Once the Rake task was written, it was simply a matter of typing rake db:development:fake_user_data to populate the database with my junk records. Pretty sweet!

You can find Faker at http://faker.rubyforge.org/.


One Response to “Using Faker to Pre-Populate a Dev Database”

  1. cdmwebs Says:

    Nice! I wrote one a lot like this here.

Leave a Reply