Есть ли способ иметь несколько файлов seed.rb? Любой вид «управления версиями» для начальных данных? - PullRequest
6 голосов
/ 20 августа 2011

Нам нужно добавить больше начальных данных для некоторых вновь добавленных таблиц в «версию 100» нашего проекта rails.

Однако, если мы просто добавим его в seed.rb и повторно запустим команду rake db: seed, она, конечно, повторно добавит исходные данные seed, дублируя их.

Итак, если вы уже добавили начальные данные в seed.rb, скажем, для TableOne ... как мы можем постепенно добавлять начальные данные для TableTwo и TableThree на более поздних этапах разработки?

Я надеялся, что смогу просто создать НОВЫЙ файл seed_two.rb и запустить rake db:seeds_two, но это выдало ошибку Don't know how to build task 'db:seeds_two'

Так что, похоже, можно использовать ТОЛЬКО «seed.rb» - так как же люди поддерживают добавочные дополнения к начальным данным?

Ответы [ 2 ]

11 голосов
/ 20 августа 2011

Вы можете повторно использовать задачу seed, но сделать ее идемпотентной .

Чтобы сделать начальное идемпотентным, просто проверьте наличие условия перед выполнением команды. Пример: вы хотите создать нового пользователя-администратора?

User.find_or_create_by_username(:username => "admin")

вместо

User.create(:username => "admin")

Однако, seed должен использоваться для заполнения вашей базы данных при создании проекта. Если вы хотите выполнять сложное заполнение данных в течение жизненного цикла приложения, просто создайте новую задачу rake, выполните ее, а затем удалите.

0 голосов
/ 14 июня 2019

Для тех, у кого есть вопросы по этому вопросу

У нас может быть несколько начальных файлов в папке db/seeds/, и мы можем написать задачу rake для запуска отдельного файла, когда мы хотим запустить

# lib/tasks/custom_seed.rake
# lib/tasks/custom_seed.rake
namespace :db do
  namespace :seed do

    Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].each do |filename|
      task_name = File.basename(filename, '.rb').intern

      task task_name => :environment do
        load(filename)
      end
    end

    task :all => :environment do
      Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].sort.each do |filename|
        load(filename)
      end
    end

  end
end

Затем, чтобы запустить конкретный начальный файл, вы можете просто запустить

rake db:seed:seed_file_name

Чтобы запустить весь начальный файл с порядком в этой папке db/seeds, выполните команду ниже

rake db:seed:all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...