Добавление пользовательского начального файла

Я хочу заполнить новую функцию фиктивными данными, но не хочу использовать файл db/seeds.rb, так как в нем уже есть другие данные, не относящиеся к этой функции.

Чтобы запустить файл seeds.rb по умолчанию, выполните команду rake db:seed.

Если я создам файл в каталоге db с именем seeds_feature_x.rb, как будет выглядеть команда rake для запуска (только) этого файла?


person Fellow Stranger    schedule 09.11.2013    source источник
comment
Мне интересен ваш случай, есть ли какой-нибудь код, который вы пробовали? Еще раз, зачем нужен еще один seed файл? Вы пытались вызвать другой метод из seeds.rb? В прошлый раз я использовал seeds.rb для вызова функции импорта из другой модели.   -  person ksugiarto    schedule 09.11.2013
comment
Если я запущу seed.rb, это заполнит мое приложение большим количеством других данных, в которых я не нуждаюсь. Вот почему я не хочу трогать его, если это возможно, и иметь новый файл семени.   -  person Fellow Stranger    schedule 09.11.2013
comment
Я вижу, я никогда не пробовал это раньше, но однажды я сделал это через миграцию: P Хотите попробовать? LOL, я зайду, когда у меня появится новая идея, но, пожалуйста, обновите ее, если вы ее нашли.   -  person ksugiarto    schedule 09.11.2013
comment
Вы можете создать пользовательскую задачу rake, которая выполняет отдельные начальные файлы. Я включил пример в свой ответ ниже...   -  person zeantsoi    schedule 09.11.2013


Ответы (3)


Начните с создания отдельного каталога для хранения ваших пользовательских сидов — в этом примере используется db/seeds. Затем создайте собственную задачу, добавив rakefile в каталог lib/tasks:

# lib/tasks/custom_seed.rake
namespace :db do
  namespace :seed do
    Dir[Rails.root.join('db', 'seeds', '*.rb')].each do |filename|
      task_name = File.basename(filename, '.rb')
      desc "Seed " + task_name + ", based on the file with the same name in `db/seeds/*.rb`"
      task task_name.to_sym => :environment do
        load(filename) if File.exist?(filename)
      end
    end
  end
end

Этот rakefile принимает имя исходного файла в каталоге db/seeds (исключая расширение .rb), а затем запускает его так, как он запустил бы seeds.rb. Вы можете выполнить задачу rake, введя в командной строке следующее:

rake db:seed:file_name # Name of the file EXCLUDING the .rb extension 

Обновление: теперь он также должен отображать исходные задачи при запуске rake --tasks или rake -T.

person zeantsoi    schedule 09.11.2013
comment
Отлично! Мне нужно было только заменить seed_file на filename (отредактировано). - person Fellow Stranger; 11.11.2013
comment
Если кому-то интересно, intern — это псевдоним to_sym. - person PJSCopeland; 07.07.2014
comment
Я получаю сообщение «Не знаю, как создать задачу «db:seed:base». Я сделал как описано, только мой начальный файл называется base.rb - person ancajic; 27.12.2015
comment
Он просматривает все файлы, но пытается загрузить только тот, который вы укажете. Как это делается, неясно, поскольку входные данные не передаются в качестве аргумента, и нет if filename == your_passed_filename, чтобы было понятно. - person JosephK; 13.04.2016
comment
У меня это отлично работает на Ruby 2.2 и Rails 4.2.5. Только убедитесь, что вы называете файл custom_seed.rake вместо custom_seed.rb (ответ правильный, но я все равно умудрился перепутать). - person vindia; 20.06.2016
comment
Немного поздно, но @JosephK Сначала я тоже изо всех сил пытался понять, как это работает, поэтому несколько раз запускал его с несколькими операторами puts для отладки. По сути, этот скрипт rake динамически создает задачу для каждого файла *.rb, который он находит в целевом каталоге. Итак, если ваша папка содержит seeds_a.rb, seeds_b.rb, seeds_c.rb, то когда вы вызываете db:seed:seeds_a, сценарий rake генерирует 3 задачи в пространстве имен seed, называемых seeds_a, seeds_b, seeds_c, каждая задача загружает соответствующий файл. Поскольку вы назвали задачу seed_a, выполняется только эта задача (и, следовательно, этот файл). - person asibs; 18.03.2017
comment
Как сделать так, чтобы они отображались при перечислении задач rake с помощью rake --tasks ? - person Magne; 06.06.2017
comment
Я выяснил. Отредактирует ответ, поэтому он также включает это. - person Magne; 06.06.2017
comment
Примечание. Вы можете перечислить все задачи (даже без описаний) с помощью rake -AT. - person Magne; 08.06.2017

Я попробовал ответ zeantsoi, но он не дал мне того, что я хотел, он сделал все файлы в каталоге. Взломал его и получил это.

namespace :db do
  namespace :seed do
    task :single => :environment do
      filename = Dir[File.join(Rails.root, 'db', 'seeds', "#{ENV['SEED']}.seeds.rb")][0]
      puts "Seeding #{filename}..."
      load(filename) if File.exist?(filename)
    end
  end
end

И чтобы использовать это, сделайте следующее:

rake db:seed:single SEED=<seed_name_without_.seeds.rb>

Это будет искать в папке Rails.root/db/seeds имя файла без .seeds.rb (он добавляет их для вас).

Рабочий пример:

rake db:seed:single SEED=my_custom_seed

Вышеприведенное заполнит файл Rails.root/db/seeds/my_custom_seed.seeds.rb

person Heath N    schedule 04.08.2015
comment
Это отлично сработало для меня! У меня также не было костей с ответом zeantsoi. Однако я удалил расширение .seeds. Спасибо за вашу помощь. - person themattkellyshow; 24.08.2015

Слишком сложно! Я просто хотел выполнить простую задачу для выполнения каждого файла в каталоге db/seeds без передачи каких-либо имен файлов.

# lib/tasks/seed.rake
desc "Run all files in db/seeds directory"

namespace :db do
  task seed: :environment do
    Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].each do |filename|
      puts "seeding - #{filename}. for reals, yo!"
      load(filename)
    end
  end
end
person Aaron Henderson    schedule 23.05.2016
comment
Это конфликтует с задачей rake db:seed. Я предлагаю изменить строку 2, чтобы читать семена задач: :environment do ... - person John Doe; 04.07.2016