Добавление настраиваемого файла семпла
Я хочу заполнить новую функцию фиктивными данными, но не хочу использовать файл db/seeds.rb, поскольку у него уже есть семена других данных, не имеющих отношения к этой функции.
Чтобы запустить файл seeds.rb
по умолчанию, вы запустите команду rake db:seed
.
Если я создам файл в каталоге db
с именем seeds_feature_x.rb
, что бы команда rake выглядела так, чтобы запускать (только) этот файл?
Ответы
Ответ 1
Начните с создания отдельного каталога для хранения ваших собственных семян - в этом примере используется db/seeds
. Затем создайте пользовательскую задачу, добавив файл rake в каталог 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
Этот файл rake принимает имя начального файла в каталоге db/seeds
(за исключением расширения .rb
), затем запускает его, поскольку он будет запускать seeds.rb
. Вы можете выполнить задачу рейка, выведя из командной строки следующее:
rake db:seed:file_name # Name of the file EXCLUDING the .rb extension
Обновление: теперь он также должен указывать начальные задачи при запуске rake --tasks
или rake -T
.
Ответ 2
Я опробовал ответ 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/seed для имени файла без .seeds.rb(он добавляет их для вас).
Рабочий пример:
rake db:seed:single SEED=my_custom_seed
Вышеупомянутый будет засеять файл Rails.root/db/seeds/my_custom_seed.seeds.rb
Ответ 3
Слишком сложно!
Мне просто нужна простая задача для выполнения каждого файла в каталоге db/seed без передачи каких-либо имен файлов.
# 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