Подтвердить что ты не робот

Как использовать 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 

Спасибо

4b9b3361

Ответ 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

Я перехватываю семя в одной транзакции