Neu: udemy Kurs Ruby für Anfänger von Stefan Wintermeyerdiv class="para">Die Rails-Götter haben mit der Datei db/seeds.rb
einen Weg geschaffen, eine frische Installation einfach und schnell mit
Default-Werten zu füttern. Es handelt sich um ein normales Ruby-Programm
innerhalb der Rails-Umgebung. Sie haben also vollen Zugriff auf alle Klassen
und Methoden aus Ihrer Applikation.
Um die in
„create“ erstellten Datensätze
in einer neuen Rails-Applikation zur Verfügung zu stellen, müssen Sie so
nicht manuell mit
rails console alles eingeben, sondern
es reicht die folgende Datei
db/seeds.rb
:
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#
# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
# Mayor.create(name: 'Emanuel', city: cities.first)
Country.create({"name"=>"Deutschland", "population"=>81831000})
Country.create({"name"=>"Frankreich", "population"=>65447374})
Country.create({"name"=>"Belgien", "population"=>10839905})
Country.create({"name"=>"Niederlande", "population"=>16680000})
Das Einspielen der Daten erfolgt dann mit
rake
db:seed. Um ganz sicher zu sein, sollten Sie im Rahmen dieses
Buches immer mit
rake db:setup die Datenbank neu
aufsetzen und dann automatisch mit der
db/seeds.rb
füttern. Das sieht dann so aus:
MacBook:europe xyz$ rake db:setup
db/development.sqlite3 already exists
-- create_table("countries", {:force=>true})
-> 0.0327s
-- initialize_schema_migrations_table()
-> 0.0004s
-- assume_migrated_upto_version(20120426092916, ["/Users/xyz/europe/db/migrate"])
-> 0.0004s
MacBook:europe xyz$
Die Datei
db/seeds.rb
bringe
ich an dieser Stelle ein, weil sie einen einfachen Mechanismus bietet, eine
leere Datenbank mit Default-Werten zu füllen. Das erleichtert uns im
weiteren Verlauf des Buches das schnelle Setup von
Beispiel-Szenarien.
Alternative Programmierung
Die
db/seeds.rb
ist ein Ruby-Programm.
Entsprechend können wir alternativ auch folgenden Weg
gehen:
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
# Mayor.create(:name => 'Daley', :city => cities.first)
country_list = [
[ "Deutschland", 81831000 ],
[ "Frankreich", 65447374 ],
[ "Belgien", 10839905 ],
[ "Niederlande", 16680000 ]
]
country_list.each do |country|
Country.create( :name => country[0], :population => country[1] )
end
Das Ergebnis ist das gleiche. Ich zeige Ihnen dieses Beispiel hier,
um noch mal klar herauszuarbeiten, dass Sie innerhalb der
db/seeds.rb
ganz normal programmieren können.
seeds.rb aus bestehenden Daten generieren
Manchmal ist es praktisch, den aktuellen Datenbestand einer
Rails-Applikation in eine db/seeds.rb
zu exportieren.
Beim Schreiben dieses Buches hatte ich dieses Problem fast in jedem
Kapitel. Es gibt dafür leider keinen Standardweg. Ich zeige Ihnen, wie man
es in diesem Fall machen kann. Komplexere Szenarien lassen sich daraus
ableiten.
Füllen Sie die Datei
lib/tasks/export.rake
mit
folgendem Inhalt:
namespace :export do
desc "Prints Country.all in a seeds.rb way."
task :seeds_format => :environment do
Country.order(:id).all.each do |country|
puts "Country.create(#{country.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
end
end
end
Danach können Sie mit dem Befehl
rake
export:seeds_format den entsprechenden
rake
-
„Task“ abrufen:
MacBook:europe xyz$ rake export:seeds_format
Country.create("name"=>"Deutschland", "population"=>81831000)
Country.create("name"=>"Frankreich", "population"=>65447374)
Country.create("name"=>"Belgien", "population"=>10839905)
Country.create("name"=>"Niederlande", "population"=>16680000)
MacBook:europe xyz$
Entweder können Sie dieses Programm so erweitern, dass die Ausgabe
direkt in die
db/seeds.rb
geschrieben wird oder Sie
benutzen einfach die Shell:
MacBook:europe xyz$ rake export:seeds_format >> db/seeds.rb
MacBook:europe xyz$
Wenn Sie in Ihrer db/seeds.rb UTF-8-Zeichen verwenden wollen, dann
müssen Sie am Anfang der Datei die Zeile
# ruby encoding: utf-8
eintragen.
Beispiel:
# ruby encoding: utf-8
Country.create({"name"=>"Deutschland", "population"=>81831000})
Country.create({"name"=>"Frankreich", "population"=>65447374})
Country.create({"name"=>"Belgien", "population"=>10839905})
Country.create({"name"=>"Niederlande", "population"=>16680000})
Country.create({"name"=>"Österreich", "population"=>8440465})
Country.create({"name"=>"Republika e Shqipërisë", "population"=>2831741})