2010-12-26 10 views
10

Ich möchte meine seeds.rb Datei in mehrere Abschnitte für die Wartungsfreundlichkeit teilen; seed alle A's in a.rb, die B's in b.rb usw. Die einzelnen Dateien befinden sich im Verzeichnis db/mit samen.rb. Jede Datei besteht aus einer Reihe von "A.Create" oder "B.Create" -Aufrufen und ich möchte diese Dateien von samen.rb aufrufen.Split seeds.rb in mehrere Abschnitte?

Ich habe versucht:

include 'a' 
include 'b' 

und

load 'a.rb' 
load 'b.rb' 

in meinem seeds.rb aber sie scheinen nicht verarbeitet, wenn ich als "rake db: Samen". Dies ist wahrscheinlich eher eine reine Ruby-Frage als eine Rails-Frage, aber aus Gründen der Vollständigkeit verwende ich Ruby 1.9.2 und Rails 3 auf einem Mac.

Antwort

20

In ./db/seeds/my_module.rb:

module MyModule 
    puts "In my_module.rb" 
    # add code here 
end 

In ./db/seeds.rb:

require File.expand_path('../seeds/my_module', __FILE__) # the ../ just removes `seeds.rb` filename from the path which is given by __FILE__ 

p "In seeds.rb" 
# add code here 
+9

Ich bin mir nicht sicher, ob es eine gute Idee ist, sie in 'db/migrate' zu ​​setzen; Migrationen und Samen sind unterschiedlich und sollten als solche behandelt werden. Stattdessen wäre ein 'db/seed'-Verzeichnis wahrscheinlich besser. – vonconrad

+3

Ja, bitte fügen Sie diese nicht in 'db/migrate' ein, sie gehören in einen separaten Ordner wie' db/seed'. –

+0

Arbeitete wie ein Charme, natürlich. Danken! (Und ich habe sie in ein separates "seeds" -Verzeichnis gestellt) – GSP

1

Ich würde vorschlagen, ein neues db/seeds/ Verzeichnis zu erstellen, wo Sie Ihre verschiedene Samen Datei platzieren können:

db/seeds/01_stuff_that_comes_for_first.rb 
db/seeds/02_stuff_that_comes_for_second.rb 
... 

Und Bearbeiten Sie dann Ihre db/seeds.rb Datei mit :

Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].sort.each { |seed| load seed } 

So können Sie Ihre Samen sogar in der Reihenfolge laden, die Sie bevorzugen - das ist oft etwas gefragt.


Diese Lösung wurde ursprünglich von nathanvda in diesem "duplicated" question vorgeschlagen.