10.2 Eine ActiveRecord-Model-Klasse generieren 

Im letzten Beispiel haben wir sowohl die Tabelle als auch die ActiveRecord-Model-Klasse manuell erstellt. Dies ist aber nicht der typische Rails-Weg (auf Schienen). Typisch ist es, einen Generator zu verwenden, der sowohl die Model-Klasse generiert als auch eine sogenannte Migration-Datei, mit der die Tabellenstruktur in Ruby definiert wird. Je nach verwendetem Generator kann zusätzlich auch ein Controller mit den passenden Views generiert werden.
Die Vorgehensweise ist wie folgt:
- Generieren des Model
Es werden u. a. die Model-Klasse und eine Migration-Datei zur Erstellung der Datenbanktabelle generiert. - Definition der Tabellenstruktur in der Migration
- Migration ausführen, damit die Tabelle generiert wird
Generatoren
Folgende Generatoren eignen sich zum Erzeugen eines Models:
- Model
Dieser Generator erstellt neben der Model-Klasse im Verzeichnis app/models mit den zugehörigen Tests in test/unit und Testdaten im Verzeichnis test/fixtures auch eine Migration-Datei für die Erstellung der Datenbank-Tabelle. Als Parameter geben Sie den Namen des Models im Singular an. Optional können Sie auch schon die Felder mit den dazugehörigen Datentypen angeben:ruby script/generate model Guest firstname:string \ lastname:string
Alle folgenden Generatoren basieren auf dem Model-Generator.
- Resource
Diesen Generator können Sie nutzen, um eine Ressource zu erzeugen. Es werden ein leeres Model, ein leerer Controller sowie die Unit und Functional Testklassen und die Fixtures generiert. Der dazugehörige Routing-Eintrag (map.resources) in der Datei config/routes.rb wird auch vorgenommen (siehe Kapitel 14). Der Generator resource erstellt keine Methoden im Controller und auch nicht die dazugehörigen Views. Das übernimmt der scaffold-Generator. Als Parameter erwartet der resource-Generator den Namen des Models im Singular und eine optionale Liste von Spaltenname: sql_type-Paaren. Werden diese angegeben, werden die entsprechenden Felder in der Migration angelegt. Die Felder created_at und updated_at werden automatisch erzeugt.ruby script/generate resource person name:string
- Scaffold
Dieser Generator erstellt alle erforderlichen Dateien mit allen erforderlichen Inhalten, um sofort eine Ressource nutzen zu können. Es werden das Model, die Migration-Datei, der Controller mit den CRUD"-Actions (Create, Read, Update, Delete), die dazugehörigen Views und die Testklassen generiert. Der für die Ressource erforderliche Routing-Eintrag (map.resources) in der Datei config/routes.rb wird auch automatisch vorgenommen. Als erster Parameter wird der Name des Models erwartet. Optional können Sie eine Liste von Spaltenname:sql_type -Paaren übergeben. Werden diese angegeben, werden die entsprechenden Felder in der Migration-Datei angelegt. Die Felder created_at und updated_at werden automatisch erzeugt.ruby script/generate scaffold post title:string \ nachricht:text
Allen Generatoren ist gemeinsam, dass sie auch Test-Code erstellen.
Generieren eines Models mit dem Model-Generator 

script/generate
Das Generator-Skript generate liegt im Ordner script und wird mit den Pflichtparametern Generator (z. B. model) und einem Namen (z. B. client) aufgerufen. Optional können Sie noch Argumente wie zum Beispiel die Feldnamen und Typen sowie Optionen wie zum Beispiel -f für »force« (überschreibt bereits vorhandene Dateien) übergeben:
ruby script/generate model client exists app/models/ create test/unit/ exists test/fixtures/ create app/models/client.rb create test/unit/client_test.rb create test/fixtures/clients.yml exists db/migrate create db/migrate/002_create_clients.rb
Folgende Dateien wurden generiert:
- Model-Klasse client.rb
class Client < ActiveRecord::Base end
- Migration 002_create_clients.rb
class CreateClients < ActiveRecord::Migration def self.up create_table :clients do |t| t.timestamps end end def self.down drop_table :clients end end
- Fixture clients.yml
# one: # column: value # # two: # column: value
- Unit-Test-Klasse client_test.rb
require File.dirname(__FILE__) + '/../test_helper' class ClientTest < Test::Unit::TestCase # Replace this with your real tests. def test_truth assert true end end
Migration
Die Model-Klasse können wir zunächst so belassen. In der Migration-Datei legen wir die Tabellenstruktur für die Tabelle fest. Wenn Sie die Feldnamen und deren Datentypen beim Generieren des Models mit übergeben haben, hat der Generator bereits für Sie die Tabellenstruktur in der Migration-Datei angelegt. Die Spaltendefinition für die ID wird nicht angegeben, da sie automatisch von Rails erstellt wird.
Weitere Details zu Migration siehe Abschnitt »Datenbankschema und Migrations« in diesem Kapitel.
class CreateClients < ActiveRecord::Migration def self.up create_table :clients do |t| t.string :firstname t.string :lastname t.date :birthday t.boolean :active, :default => true t.timestamps end end def self.down drop_table :clients end end
rake db:migrate
Mit dem folgenden Befehl wird die Migration ausgeführt. Das bedeutet, dass der Ruby-Code in einen SQL-Befehl umgewandelt und ausgeührt wird, um die entsprechende Tabelle zu generieren:
rake db:migrate == 2 CreateClients: migrating ======================== -- create_table(:clients) -> 0.0037s == 2 CreateClients: migrated (0.0039s) ===============
Test in der Konsole
In der Konsole kann das eben erstellte Model getestet werden:
ruby script/console >> Client.count => 0 >> Client.create(:firstname=>"William", :lastname=>"Adama") => ... >> Client.count => 1 >> william = Client.find(1) => ... >> william.firstname => "William" >> william.birthday => nil >> william.active => true >> william.created_at => Fri Jan 25 07:49:20 +0100 2008
Interessant ist die letzte Ausgabe. Das Attribut created_at und updated_at wurde automatisch gesetzt (dazu später mehr).
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.