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.