Neu: Das englische Ruby on Rails 4.0 Buch.

4.5. Mit seeds.rb die Datenbank betanken

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$ 

UTF-8

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})