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:dump
invece didb:schema:dump
db:structure:load
invece 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, ...