Guerilla Projektmanagement

IT Projekte und Zeuch

Ruby on Rails 1: Das Datenmodell

Ich hatte ja schon vor laaanger Zeit mal ein wenig über Ruby geschrieben.

Da mein aktuelles Projekt abgeschlossen ist und ich jetzt ein wenig Zeit für ein paar eigene Projekte eingeplant habe (hach, welch ein Luxus), beschäftige ich mit jetzt wieder mehr mit Ruby On Rails (RoR). In nächster Zeit könnte es also hier ein wenig technischer werden.

Es gibt reichlich RoR Einführungen im Web. Ich beschränke mich daher, quasi als Anheizer nur ein paar Highlights der Sprache bzw. des Frameworks zu beschreiben

Zum Anfang:
Wer selber damit herumspielen möchte, dem sei Für Windows Instant Rails empfohlen. Das ist eine Umgebung, welche ohne Installation mit allem Zip und Zap (Web-Server, MySQL) läuft. Unter Mac OS gibt es das auch: Locomotive. Es kommt sogar noch besser: Die neue MacOS Version 10.5. – Leopard – wird RoR Support integriert haben!

So, jetzt aber los.

Was ist die eigentliche Idee?
Ruby On Rails ist ein MVC Framework. MVC steht für Modell, View, Controller. Es geht dabei um die Trennung von Datenmodell, Oberfläche und Geschäftslogik.
MVC Anwendungen sind sehr flexibel. Durch die Trennung der einzelnen Bereiche lässt sich z.B. einfach die Datenbank austauschen oder eine Applikation für verschiedene Frontends schreiben.

Teil 1: Das Modell
Sprechen wir zuerst über das Datenmodell. Es gibt dabei u.a. folgende Anforderungen:
1. Ich will die Definition meiner Daten nicht ständig wiederholen müssen.
2. Datenobjekte stehen untereinander in Beziehung. z.B. hat eine Person mehrere Adressen
3. Ich will möglichst unabhängig von der benutzen Datenbank sein
4. Andere Entwickler sollen schnell verstehen, was ich programmiert habe.

Ok, schauen wir uns mal an, wie RoR das löst.
Zuerst legen wir ein Projekt an. Ich arbeite gerade an einem Projekt zum Vokabellernen (URL kommt in ein paar Tagen). Also legen wir erstmal das Projekt an:
rails lernkartei
Dieser Befehl legt das Verzeichnis lernkartei an und erzeugt einige Dateien.
Es soll User geben, die User haben Lernkästen und in den Lernkästen gibt es Lernkarten. Also los:
cd lernkartei
ruby script/generate model user
ruby script/generate model box
ruby script/generate model card

Damit haben wir in dem Verzeichnis db/migrate 3 neue Dateien:
001_create_users.rb
002_create_boxes.rb
003_create_cards.rb

Hä?!? Warum steht denn dort „users“ statt „user“? Tja, RoR versucht Einzahl von Mehrzahl zu unterscheiden. Ein Objekt mit dem Namen card wird also in der Tabelle cards gespeichert.

In diesen Dateien wird nun das Datenmodell definiert. Nur mal als Beispiel, hier die Lernkarte:
class CreateLernkartes < ActiveRecord::Migration def self.up create_table :lernkartes do |t| t.column :frage, :string, :null=> false
t.column :antwort, :string, :null => false
t.column :anmerkung, :string, :default => ""
t.column box_id, :integer
end
end

def self.down
drop_table :lernkartes
end
end

Ich denke, dass kann man recht gut lesen.
(Definition für User und Box lassen ich hier aus)

So, und jetzt wird es spannend. Wir erinnern uns, Benutzer haben Lernboxen und die Boxen haben Karten.
Datei: app/models/user.rb
class User < ActiveRecord::Base has_many :boxes end

Ok, jetzt die Box.
Datei: app/models/box.rb
class Box < ActiveRecord::Base belongs_to :user has_many :cards end

Ist das cool, oder was? Auch, wer gar keine Ahnung von Softwareentwicklung hat, versteht das: Eine Box gehört zu Benutzern und besitzt viele Karten. Man kann sämtliche Beziehungen abbilden, also 1:1, 1:N und M:N.

Jetzt sagen wir rails, dass wir das Datenmodell in der Datenbank anlegen wollen:
rake db:migrate

Und wie durch Zauberei werden die benötigten Tabellen angelegt (ok: nur, wenn man in db/database.yaml die richtigen Parameter eingetragen hat).

Wie greift man nun auf die Daten zu? So zum Beispiel:
currentUser = User.find_by_name("heinzel") # die SQL Abfrage wird hier gekapselt
currentBoxes= currentUser.boxes # hier greifen wir also auf die Objekte zu
aCard = Box.find_by_frage("dog")
aCard = Box.find_by_frage_and_antwort("dog","hund") # Nett, was? Man kann auch so suchen
firstUser = User.find(:first)

Wer will, kann auch SQL benutzen: User.find_by_sql(„select * from (usw usw.)“)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.