How can one make the task rake db:seed
to use different seeds.rb file on production and development?
edit: any better strategy will be welcome
You can have a rake task behave differently based on the current environment, and you can change the environment a task runs in by passing RAILS_ENV=production
to the command. Using these two together you could produce something like so:
Create the following files with your environment specific seeds:
db/seeds/development.rb
db/seeds/test.rb
db/seeds/production.rb
Place this line in your base seeds file to run the desired file
load(Rails.root.join( 'db', 'seeds', "#{Rails.env.downcase}.rb"))
Call the seeds task:
rake db:seed RAILS_ENV=production
I like to implement all seeds inside one seed.rb
file and then just separate the environments inside.
if Rails.env.production?
State.create(state: "California", state_abbr: "CA")
State.create(state: "North Dakota", state_abbr: "ND")
end
if Rails.env.development?
for 1..25
Orders.create(order_num: Faker::Number:number(8), order_date: Faker::Business.credit_card_expiry_date)
end
end
That way you do not need to cast the RAILS_ENV property on your rake task, or manage multiple files. You also can include Rails.env.test?
, but I personally let RSPEC take care of the testing data.