Questa parte della tua domanda:
So che possiamo crearlo manualmente in PostgreSQL, ma la "magia" con Active Record è che il database può essere ricreato con tutti i modelli.
mi dice che stai davvero cercando un modo per integrare le funzioni PostgreSQL con il normale processo di migrazione di Rails e le attività Rake come db:schema:load .
Aggiungere e rimuovere funzioni nelle migrazioni è facile:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Devi utilizzare up separato e down metodi invece di una singola change metodo perché ActiveRecord non avrà idea di come applicare e tanto meno invertire la creazione di una funzione. E usi connection.execute per inviare la definizione della funzione grezza a PostgreSQL. Puoi farlo anche con un reversible dentro 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
ma lo trovo più rumoroso di up e down .
Tuttavia, schema.rb e le solite attività di Rake che funzionano con schema.rb (come db:schema:load e db:schema:dump ) non saprà cosa fare con le funzioni PostgreSQL e altre cose che ActiveRecord non comprende. C'è un modo per aggirare questo problema, puoi scegliere di usare un structure.sql file invece di schema.rb impostando:
config.active_record.schema_format = :sql
nel tuo config/application.rb file. Successivamente, db:migrate scriverà un db/structure.sql file (che è solo un dump SQL grezzo del tuo database PostgreSQL senza i tuoi dati) invece di db/schema.rb . Utilizzerai anche diverse attività di Rake per lavorare con structure.sql :
db:structure:dumpinvece didb:schema:dumpdb:structure:loadinvece didb:schema:load
Tutto il resto dovrebbe funzionare allo stesso modo.
Questo approccio ti consente anche di utilizzare altre cose nel tuo database che ActiveRecord non comprende:CONTROLLA vincoli, trigger, impostazioni predefinite di colonna non semplicistiche, ...