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.