Как использовать seed.rb для выборочного заполнения баз данных разработки и/или производства?
Я использую seed.rb для заполнения и моей базы данных разработки и производства. Обычно я заполняю первые фиктивные данные, а последние - реальными минимальными данными, которые нужно выполнить моему приложению (например, первый пользователь и т.д.).
Как я могу указать в seed.rb для какой среды есть данные?
Учитывая, что я знаю, что "группа" является методом Gemfile, я хотел бы добиться такого же поведения для seed.rb.
например. Я хотел бы написать что-то подобное в моем seed.rb:
group :development do
# development specific seeding code
end
group :production do
# production specific seeding code
end
# non-specific seeding code (it always runs)
Это позволяет вызывать как специфический для разработки, так и неспецифический код с помощью
$ rake db:seed
И вызвать как производственный, так и неспецифический код с помощью
$ rake db:seed RAILS_ENV=production
Спасибо
Ответы
Ответ 1
seeds.rb
- всего лишь простой рубиновый файл, поэтому есть несколько способов, которыми вы могли бы приблизиться к этому. Как насчет утверждения case?
# do common stuff here
case Rails.env
when "development"
...
when "production"
...
end
Ответ 2
Можно создать другой подход:
db/seeds/development.rb
db/seeds/production.rb
db/seeds/any_other_environment.rb
Тогда в db/seeds.rb
:
# Code you want to run in all environments HERE
# ...
load(Rails.root.join( 'db', 'seeds', "#{Rails.env.downcase}.rb"))
Затем напишите код, который вы хотите запустить для каждой среды в соответствующем файле.
Ответ 3
другой подход, весьма похожий на @fabro:
добавьте семя папки в db/
с именами среды и другим именем common.rb, так что вы получите что-то вроде:
db/seeds/common.rb
db/seeds/development.rb
db/seeds/staging.rb
db/seeds/production.rb
чем в seed.rb
:
ActiveRecord::Base.transaction do
['common', Rails.env].each do |seedfile|
seed_file = "#{Rails.root}/db/seeds/#{seedfile}.rb"
if File.exists?(seed_file)
puts "- - Seeding data from file: #{seedfile}"
require seed_file
end
end
end
Я перехватываю семя в одной транзакции