Dieser Teil Ihrer Frage:
Ich weiß, dass wir es manuell in PostgreSQL erstellen können, aber das „Magische“ mit Active Record ist, dass die Datenbank mit allen Modellen neu erstellt werden kann.
sagt mir, dass Sie wirklich nach einer Möglichkeit suchen, PostgreSQL-Funktionen in den normalen Rails-Migrationsprozess und Rake-Aufgaben wie db:schema:load
zu integrieren .
Das Hinzufügen und Entfernen von Funktionen in Migrationen ist einfach:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Sie müssen ein separates up
verwenden und down
Methoden anstelle einer einzelnen change
Methode, da ActiveRecord keine Ahnung hat, wie man eine Funktionserstellung anwendet, geschweige denn umkehrt. Und Sie verwenden connection.execute
um die rohe Funktionsdefinition an PostgreSQL zu übergeben. Sie können dies auch mit einem reversible
tun innerhalb von change
:
def change
reversible do |dir|
dir.up do
connection.execute(%q(
create or replace function ...
))
end
dir.down do
connection.execute(%q(
drop function ...
))
end
end
end
aber ich finde das lauter als up
und down
.
Allerdings schema.rb
und die üblichen Rake-Tasks, die mit schema.rb
arbeiten (z. B. db:schema:load
und db:schema:dump
) weiß nicht, was mit PostgreSQL-Funktionen und anderen Dingen zu tun ist, die ActiveRecord nicht versteht. Es gibt jedoch einen Weg, dies zu umgehen, Sie können wählen, ob Sie eine structure.sql
verwenden möchten Datei anstelle von schema.rb
durch Einstellung:
config.active_record.schema_format = :sql
in Ihrer config/application.rb
Datei. Danach db:migrate
schreibt eine db/structure.sql
Datei (die nur ein roher SQL-Dump Ihrer PostgreSQL-Datenbank ohne Ihre Daten ist) anstelle von db/schema.rb
. Sie werden auch verschiedene Rake-Aufgaben für die Arbeit mit structure.sql
verwenden :
db:structure:dump
stattdb:schema:dump
db:structure:load
stattdb:schema:load
Alles andere sollte genauso funktionieren.
Mit diesem Ansatz können Sie auch andere Dinge in Ihrer Datenbank verwenden, die ActiveRecord nicht versteht:CHECK-Einschränkungen, Trigger, nicht einfältige Spaltenvorgaben, ...