Migration in Rails - Wirklich clever

Migration in Rails ist ein Konzept zur Entwicklung, Abstraktion und Dokumentation von Datenbankstrukturen. Der übliche Weg zur Entwicklung bzw. Definition eines Datenbankschema in MySQL ist die Nutzung der DDL (Data Definition Language) wobei man üblicherweise Anweisungen wie diese in einer Datei speicherte:

CREATE TABLE `sample` (
`id` INT NOT NULL AUTO_INCREMENT ,
`caption` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NOT NULL ,
`position` INT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;

Diese Dateien werden dann (ggfls. mit DROP TABLE IF EXISTS) über den MySQL Client oder auch PhpMyAdmin in die Datenbank eingespielt. Ich selber habe in meinem alten Framework diese Änderungen in jeweils eine Datei pro Änderung gepackt und in das Subversion Repository eingepflegt. So hatten alle beiteiligten Programmierer die Möglich stets den aktuellen Stand der Datenbank nachzuvollziehen. Migrationen in Rails gehen da noch einen Schritt weiter, es gibt wie üblich einen Generator dem man die Verwaltung und Erzeugung der Migrationen anvertraut.
script/generate migration AddedUserTable
Rails erzeugt nun im Verzeichnis /db/migrate/ eine Datei mit dem Namen 001_added_user_table.rb. Die Datei hat folgenden Inhalt:

class AddedUserTable < ActiveRecord::Migration
  def self.up
  end

  def self.down
  end
end

Um nun dem Namen der Klasse gerecht zu werden bestücken wir die Methode mit Code der eine User Tabelle erzeugt.

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table "users", :force => true do |t|
      t.column :login,                     :string
      t.column :email,                     :string
      t.column :crypted_password,          :string,   :limit => 40
      t.column :salt,                      :string,   :limit => 40
      t.column :created_at,                :datetime
      t.column :updated_at,                :datetime
      t.column :remember_token,            :string
      t.column :remember_token_expires_at, :datetime
      t.column :subscription_status,       :string,   {:default => "new"}
      
    end
  end

  def self.down
    drop_table "users"
  end
end


Und sofort wird deutlich wie mächtig die Migrationen in Rails wirklich sind. Die Datenbankspezifischen DDL Anweisungen sind verschwunden und es gibt eine Syntax für alle Datenbanksysteme.