Ruby on Rails: Tipps - Model


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.