Hinzufügen einer benutzerdefinierten Seed-Datei

73

Ich möchte eine neue Funktion mit Dummy-Daten füllen, aber nicht die Datei db / seeds.rb verwenden, da sie bereits andere Daten enthält, die für diese Funktion irrelevant sind.

Um die Standarddatei seeds.rbauszuführen, führen Sie den Befehl aus rake db:seed.

Wenn ich eine Datei in dem dbVerzeichnis mit dem Namen seeds_feature_x.rbaufstelle, wie würde der Befehl rake aussehen, um (nur) diese Datei auszuführen?

Fremder
quelle
Ich bin interessant für Ihren Fall. Gibt es einen Code, den Sie ausprobiert haben? Nochmals, warum brauchen Sie noch eine seedDatei? Haben Sie versucht, eine andere Methode von seeds.rbaufzurufen? Das letzte Mal habe ich seeds.rbein Import-Feature von einem anderen Modell
aufgerufen
Wenn ich seeds.rb ausführen würde, würde meine Anwendung mit vielen anderen Daten versehen, die ich nicht benötige. Das ist der Grund, warum ich es wenn möglich nicht berühren und eine neue Seed-Datei haben möchte.
Fellow Stranger
Ich verstehe, ich habe es noch nie versucht, aber ich habe dies einmal durch eine Migration getan: P Willst du es versuchen? LOL anw, ich komme vorbei, wenn ich eine neue Idee habe, aber bitte aktualisiere sie, wenn du eine gefunden hast.
Ksugiarto
Sie können eine benutzerdefinierte Rake-Task erstellen, die einzelne Seed-Dateien ausführt. Ich habe ein Beispiel in meine Antwort unten aufgenommen ...
zeantsoi

Antworten:

178

Erstellen Sie zunächst ein separates Verzeichnis für Ihre benutzerdefinierten Seeds - in diesem Beispiel wird verwendet db/seeds. Erstellen Sie dann eine benutzerdefinierte Aufgabe, indem Sie Ihrem lib/tasksVerzeichnis eine Rake-Datei hinzufügen :

# 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

Diese Rake-Datei akzeptiert den Namen einer Seed-Datei im db/seedsVerzeichnis (mit Ausnahme der .rbErweiterung) und führt sie dann so aus, wie sie ausgeführt werden würde seeds.rb. Sie können die Rechenaufgabe ausführen, indem Sie über die Befehlszeile Folgendes ausgeben:

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

Update: Jetzt sollten auch die Startaufgaben beim Ausführen von rake --tasksoder aufgelistet werden rake -T.

zeantsoi
quelle
3
Ausgezeichnet! Ich hatte nur zu ersetzen , seed_filemit filename(bearbeitet).
Fellow Stranger
20
Für den Fall, dass sich jemand wundert, internist ein Alias ​​für to_sym.
PJSCopeland
2
Ich erhalte die Meldung "Ich weiß nicht, wie ich die Aufgabe 'db: seed: base' erstellen soll". Ich habe wie beschrieben getan, nur meine Seed-Datei heißt base.rb
ancajic
1
Es durchläuft alle Dateien, versucht jedoch nur, die von Ihnen angegebene zu laden. Wie dies geschieht, ist nicht klar, da die Eingabe nicht als Argument übergeben wird und es kein "if filename == your_passed_filename" gibt, um dies zu verdeutlichen.
JosephK
3
Dies funktioniert gut für mich unter Ruby 2.2 und Rails 4.2.5. Stellen Sie nur sicher, dass Sie die Datei custom_seed.rakeanstelle von aufrufen custom_seed.rb(die Antwort ist korrekt, aber ich habe es trotzdem geschafft, dies zu verwechseln).
Vindia
14

Ich habe die Antwort von zeantsoi ausprobiert, aber sie hat mir nicht das gegeben, was ich wollte, sondern alle Dateien in einem Verzeichnis. Hackte es weg und bekam das.

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

Und um dies zu verwenden, gehen Sie wie folgt vor:

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

Dadurch wird im Ordner Rails.root / db / seed nach einem Dateinamen ohne .seeds.rb gesucht (dieser wird für Sie hinzugefügt).

Arbeitsbeispiel:

rake db:seed:single SEED=my_custom_seed

Das obige würde die Rails.root/db/seeds/my_custom_seed.seeds.rbDatei setzen

Heide N.
quelle
2
Das hat bei mir perfekt funktioniert! Ich hatte auch keine Würfel mit Zeantsois Antwort. Ich habe jedoch die Erweiterung .seeds entfernt. Danke für Ihre Hilfe.
themattkellyshow
10

Zu kompliziert! Ich wollte nur eine einfache Aufgabe, um jede Datei im Verzeichnis db / seed auszuführen, ohne Dateinamen zu übergeben.

# 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
Aaron Henderson
quelle
2
Dies steht im Widerspruch zur Rechenaufgabe db: seed. Ich schlage vor, Zeile 2 zu ändern, um Task Seeds zu lesen
John Doe