web-dev-qa-db-fra.com

Ajout d'un fichier de départ personnalisé

Je veux remplir une nouvelle fonctionnalité avec des données factices, mais je ne veux pas utiliser le fichier db/seeds.rb car il contient déjà des graines d'autres données non pertinentes pour cette fonctionnalité.

Pour exécuter la valeur par défaut seeds.rb fichier, vous exécutez la commande rake db:seed.

Si je crée un fichier dans le répertoire db appelé seeds_feature_x.rb, à quoi ressemblerait la commande rake pour exécuter (uniquement) ce fichier?

69
Fellow Stranger

Commencez par créer un répertoire distinct pour contenir vos graines personnalisées - cet exemple utilise db/seeds. Ensuite, créez une tâche personnalisée en ajoutant un rakefile à votre lib/tasks répertoire:

# 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

Ce rakefile accepte le nom d'un fichier de départ dans le db/seeds répertoire (à l'exclusion du .rb extension), puis l'exécute comme s'il s'exécutait seeds.rb. Vous pouvez exécuter la tâche de râteau en émettant ce qui suit à partir de la ligne de commande:

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

Mise à jour: maintenant, il devrait également répertorier les tâches de démarrage lors de l'exécution de rake --tasks ou rake -T.

164
zeantsoi

J'ai essayé la réponse de zeantsoi mais elle ne m'a pas donné ce que je voulais, elle a fait tous les fichiers dans un répertoire. Détourné et obtenu ceci.

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

Et pour l'utiliser, procédez comme suit:

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

Cela cherchera dans le dossier Rails.root/db/seeds un nom de fichier sans .seeds.rb (il ajoute ceux pour vous).

Exemple de travail:

rake db:seed:single SEED=my_custom_seed

Ce qui précède ensemencerait le Rails.root/db/seeds/my_custom_seed.seeds.rb fichier

12
Heath N

Trop compliqué! Je voulais juste une tâche simple pour exécuter chaque fichier sous le répertoire db/seeds sans passer de nom de fichier.

# 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
9
Aaron Henderson