Zum Inhalt springen

Ruby on Rails: Tipps - Model

Aus Wikibooks


Migration und benannte Sql-Schemata

[Bearbeiten]

Problem

[Bearbeiten]

Das Migration-System von Rails unterstützt keine benannten Sql-Schemata, wie sie beispielsweise von Postgresql unterstützt werden.

Lösung

[Bearbeiten]

Die Kommandos create_schema und drop_schema sollen in das Migration-System für Postgresql-Datenbanken integriert werden. Mit den Kommandos sollen benannte Schemata erstellt oder entfernt werden. Die Option force, soll trotz Widersprüchen die Aktion ausführen.

Dazu muss der PostgreSQLAdapter erweitert werden. In einer neu anzulegenden Datei lib/migration_ext.rb werden die neuen Kommandos definiert:

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  #
  # Benanntes Schema erstellen.
  #
  def create_schema schema_name, options={}
    # Bei der force-Option wird ein möglicherweise vorhandenes Schema gelöscht
    drop_schema schema_name, :force => true if options[:force] rescue nil
    
    execute "CREATE SCHEMA #{schema_name}"
  end
  
  #
  # Benanntes Sql-Schema entfernt.
  #
  def drop_schema(schema_name, options={})
    sql = ''
    sql << "DROP SCHEMA #{schema_name}"
    # Die force-Option entfernt das Schema, auch wenn Abhängigkeiten bestehen.
    sql << ' CASCADE' if options[:force]
    execute sql
  end
end

In der Datei config/environment.rb wird die Zeile

require 'migration_ext'

am Dateiende ergänzt, so dass Rails die Erweiterung einbindet.

Beispiel

[Bearbeiten]

Innerhalb einer Migration kann ein Schema erstellt oder entfernt werden. Die Tabellenkommandos können anschließend auf das Schema zugreifen:

class Sport < ActiveRecord::Migration
  def self.up
    create_schema 'sport'
    
    create_table 'sport.activities' do |t|
      t.column 'description', :string
      t.column 'day', :date
    end
  end

  def self.down
    drop_table 'sport.activities'
    drop_schema 'sport', :force => true
  end
end

Hinweise

[Bearbeiten]
  • Es fehlt die Verallgemeinerung für andere Datenbanken.
  • Eleganter ist eine Realisierung als Plugin.