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:dumpstattdb:schema:dumpdb:structure:loadstattdb: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, ...