Posts Tagged ‘file’

Daten aus der IRB-Console speichern mit einer Zeile

Dienstag, Mai 27th, 2008

Rails bringt ein Konsolenskript mit, welches IRB mit der Rails-Umgebung lädt. Dort stehen dann alle im Rails-Projekt verwendeten Klassen zur Verfügung. Erreichen kann man diese Konsole unter der Eingabe von “ruby script/console [environment]” Wird keine Umgebung (environment) angegeben, ist die Development-Umgebung gewählt. Das bedeutet, die Datenbankverbindung wird zur Development-Datenbank aufgebaut. Alternativ kann man hier auch “production” (oder “test”, etc.) angeben.

Nun kann man beliebige Ruby-Befehle eingeben und das Ergebnis gleich begutachten. Aber darum soll es hier jetzt gar nicht im Detail gehen. Die Konsole ist ungeheuer praktisch, wenn man Daten aus der Datenbank auslesen möchte, die über komplexe Models verknüpft sind. Statt direkt auf der SQL-Konsole mit langen JOINs rumzubasteln, benutzt man einfach ein die Model-Klassen aus dem Rails-Projekt.

Dateien schreiben mit der File-Klasse

Aber wie bekommt man diese Daten aus der Konsole? Die File-Klasse ermöglicht es Dateien mit einem Block zu schreiben, so dass der ganze Befehl nur eine einzige Zeile benötigt:

File.open("output.txt", "w") { |f| f.puts "Ausgabe" }

Das erzeugt eine Datei output.txt im aktuellen Verzeichnis und schreibt den Inhalt “Ausgabe” hinein. (Das “w” als zweiter Parameter gibt den schreibmodus an, vorherige Inhalte der Datei werden gelöscht!)

Nehmen wir als einfaches Beispiel an, uns interessieren alle Benutzernamen eines fiktiven Projekts, nach Name sortiert. In der Konsole erhalten wir durch Eingabe von

User.find(:all, :order => :name)

eine solche Liste als Array von User-Objekten. Mit einem kurzen Block können wir die gewünschten Namen Ausgeben:

User.find(:all, :order => :name).each { |user| puts user.name }

Um diese Liste jetzt aus der Konsole zu bekommen, setzen wir diese Zeile innerhalb des File-Blocks ein. Wichtig hierbei ist, dass die puts-Anweisung auf das File-Objekt angewendet wird, damit die Ausgabe dorthin umgeleitet wird!

File.open("output.txt", "w") { |f| User.find(:all, :order => :name).each { |user| f.puts user.name }  }

Fertig! Jetzt kann die Konsole mit der Eingabe von quit oder exit beendet werden und im gleichen Verzeichnis findet sich eine Datei mit dem Namen output.txt, die die Liste enthält.

Die Abfrage im Beispiel ist natürlich trivial- bei komplexeren Abfragen mit viel Model-Logik ist es aber eine große Erleichterung.